import { defineStore } from 'pinia';
import axios from 'axios';

export const useAuterizationStore = defineStore('Auterization', {
    state: () => ({
        isLogged: false,
        userName: 'NotUser',
        userRegistered: '0000-00-00',
        userAvatar: require('@/assets/img/user_avatar.jpg'),

        //Preferencje
        userPreference: {},


        //failLogin
        failLogin: false,

        //adres do validacji
        validUrl: `${process.env.VUE_APP_USER_VALID}`,
        checkUrl: `${process.env.VUE_APP_USER_CHECK}`
    }),
    actions: {
        async ValidLogin(email, password, remember) {
            try{
                const response = await axios.post('/api/user/login', 
                {
                    email: email,
                    password: password,
                    remember: remember,
                }, {
                    withCredentials: true,
                    headers: {
                        'Content-Type': 'application/json'
                    },
                });

                if(!response.data.isLogged){
                    this.failLogin = true;
                    return false;
                }
                this.isLogged = response.data.isLogged;
                this.userName = response.data.user;
                this.userRegistered = response.data.regdate;
                this.userPreference = response.data.preference;
                this.failLogin = false;

                if(response.data.avatar) {
                    this.userAvatar = 'data:image/jpeg;base64,' + response.data.avatar;
                }

                return true
            }
            catch(error){
                console.error('Błąd:', error);
                this.failLogin = true;
                return false
            }
        },

        //Pobierz zalogowaną sessję o ile jest zalogowany user
        async GetLoginSession(){
            try{
                const response = await axios.get('/api/user/checksession', {withCredentials: true});

                console.log('Sukces:', response);

                if(!response.data.isLogged){
                    this.failLogin = true;
                    return false;
                }
                this.isLogged = response.data.isLogged;
                this.userName = response.data.user;
                this.userRegistered = response.data.regdate;
                this.userPreference = response.data.preference;
                this.failLogin = false;

                if(response.data.avatar) {
                    this.userAvatar = 'data:image/jpeg;base64,' + response.data.avatar;
                }

                return true
            }
            catch(error){
                console.error('Błąd:', error);
                this.failLogin = true;
                return false
            }
        },

        async LogoutUser(){
            try {
                const response = await axios.delete('/api/user/logout', {withCredentials: true});
                
                if(response.data.success) {
                    this.isLogged = false;
                    this.userName = 'NotUser';
                    this.userRegistered = '0000-00-00';
                    this.userAvatar = require('@/assets/img/user_avatar.jpg');
                }

                return response.data.success;
            }
            catch(e){
                console.error('Błąd podczas wylogowywania:', e);
                alert('Nie udało się wylogować.');
                return false;
            }
        },

        async UpdateUserPref(pref) {
            try {
                await axios.put('/api/user/preference', pref, {withCredentials: true});
                this.userPreference = pref;
            }
            catch(e) {
                console.error(`Nie udało się zaktualizować preferencji`);
            }
        },

        //Aktualizacja danych użytkownika
        async UpdateUserAvatar(avatar) {
            try {
                const response = await axios.put('/api/user/avatar/update', avatar, {withCredentials: true});
                if (response.data.success) {
                    this.userAvatar = 'data:image/jpeg;base64,' + response.data.avatar;
                }
                return response.data;
            }
            catch(e) {
                if (e.response && (e.response.status === 400 || e.response.status === 401)) {
                    console.warn(`Błąd HTTP ${e.response.status}:`, e.response.data);
                    return e.response.data;
                }
                console.error(`Nie udało się zaktualizować avatara: ${e}`);
            }
        },

        async DeleteUserAvatar() {
            try {
                const response = await axios.delete('/api/user/avatar/delete', {withCredentials: true});
                if(response.data.success) {
                    this.userAvatar = require('@/assets/img/user_avatar.jpg');
                }
                return response.data;
            }
            catch(e) {
                if (e.response && (e.response.status === 400 || e.response.status === 401)) {
                    console.warn(`Błąd HTTP ${e.response.status}:`, e.response.data);
                    return e.response.data;
                }
                console.error(`Nie udało się skasować avatara: ${e}`);
            }
        },

        async UpdateUserData(data) {
            try {
                const response = await axios.put('/api/user/data/update', data, {withCredentials: true});
                if(response.data.success) {
                    this.userName = response.data.username;
                }
                return response.data;
            }
            catch(e) {
                if (e.response && (e.response.status === 400 || e.response.status === 401)) {
                    console.warn(`Błąd HTTP ${e.response.status}:`, e.response.data);
                    return e.response.data;
                }
                console.error(`Nie udało się zaktualizować danych użytkownika: ${e}`);
            }
        },

        async UpdateUserPassword(password) {
            try {
                const response  = await axios.put('/api/user/password/update', password, {withCredentials: true});
                return response.data;
            }
            catch(e) {
                if (e.response && (e.response.status === 400 || e.response.status === 401)) {
                    console.warn(`Błąd HTTP ${e.response.status}:`, e.response.data);
                    return e.response.data;
                }
                console.log(`Nie udało się zaktualizować hasła: ${e}`);
                return {success: false, mess: `Nie udało się zaktualizować hasła: ${e}`};
            }
        },

        //Reset hasla
        async RecoveryAccount(email) {
            try {
                const response = await axios.post('/api/user/recovery', email, {withCredentials: true});
                return response.data;
            }
            catch(e) {
                console.warn(`Nie udało się odzyskać konta :c ${e}`);
                return {success: false, mess: "Nie udało sie wysłać maila recovery"};
            }
        }
    },

    persist: {
        enabled: true, // Włączenie persystencji dla tego store
        strategies: [
          {
            key: 'auterization', // Klucz w localStorage
            storage: localStorage, // Możesz zmienić na sessionStorage
          },
        ],
    },
});