import {defineStore} from 'pinia';
import {ref} from 'vue';
import apiClient from "@/services/axiosSetup";
import {useRoute, useRouter} from "vue-router";
import {useSpaceStore} from "@/stores/spaceStore";

export const useUserStore = defineStore('user', () => {
    const user = ref(null);
    const loadingUser = ref(true);
    const router = useRouter();
    const spaceStore = useSpaceStore();
    const route = useRoute();
    const settings = ref({"budgetViewVersion": "2", "budgetCalendarOpened": false})

    async function fetchUserProfile() {
        // Убираем проверку на `loadingUser`, чтобы не блокировать запрос
        if (!user.value) {
            loadingUser.value = true;
            try {
                const response = await apiClient.get('/auth/me'); // запрос к API для получения данных пользователя
                if (response.status !== 200) throw new Error('Ошибка загрузки данных пользователя');

                user.value = response.data;
            } catch (error) {
                console.error('Ошибка при загрузке данных пользователя:', error);
                user.value = null;
            } finally {
                loadingUser.value = false;  // Сбрасываем флаг `loadingUser` в `false` после завершения
            }
        }
    }

    // Основная функция для логина
    async function login(username, password, tg_id = null) {
        try {
            let response;
            if (tg_id) {
                response = await apiClient.post('/auth/token/tg', {tg_id: tg_id});
            } else {
                response = await apiClient.post('/auth/login', {
                    username: username,
                    password: password,
                });
            }

            const token = response.data.token;
            localStorage.setItem('token', token);
            apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`;
            await fetchUserProfile();
            await spaceStore.fetchSpaces()
            await router.push(route.query['back'] ? route.query['back'].toString() : '/');
        } catch (error) {
            console.error(error);
            alert('Ошибка входа. Проверьте логин и пароль.');
        }
    };

    async function register(username, password, firstName) {
        try {
            let response = await apiClient.post('/auth/register', {
                username: username,
                password: password,
                firstName: firstName
            })
            return response.data
        } catch (error) {
            // console.error(error);
            throw error
        }
    }


    return {user, loadingUser, fetchUserProfile, login, settings, register};
});
