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

export const useAnimeStore = defineStore('Anime', {
    state: () => ({
        search: {},
        group_storage: [],
        animes_storage: [],
        isLoaded: false,

        filter: -2,

        //Wyszukiwarka
        searchStringFilter: "",

        //adres do validacji
        serverUrl: `${process.env.VUE_APP_SERVER}`
    }),

    actions: {
        async GetAnime(filter){
            try{
                this.filter = filter;
                const response = await axios.get('/api/content', {withCredentials: true});

                console.log(response);

                this.animes_storage = response.data.animes;
                this.group_storage = response.data.groups;


                this.isLoaded = true;

                //return response.data;

                return {
                    isLoaded: this.isLoaded,
                    anime: this.animes_storage,
                    search: this.search,
                    group: this.group_storage         
                };
            }
            catch(e){
                console.error('Nie udało się pobrać danych');
                return {
                    isLoaded: false,
                    mess: 'Nie udało się pobrać animu :c'
                };
            }
        },

        //filtrowane dane przez filtr
        GetFilteringData(filter) {
            this.filter = filter;
            return this.SerializedData(this.group_storage, this.animes_storage);
        },

        //filtrowane dane przez wyszukiwarkę
        GetSearchData(search) {
            this.searchStringFilter = search;
            console.log(`STORAGE1: ${this.searchStringFilter}`);
            return this.SerializedData(this.group_storage, this.animes_storage);
        },

        //Pobieranie listy anime
        async GetAnimeContent(sort) {
            try {
                const response = await axios.post('/api/content/result/sort', sort, {withCredentials: true});
                return response.data;
            }
            catch(e) {
                console.error('Nie udało się pobrać danych');
                return {
                    isLoaded: false,
                    mess: 'Nie udało się pobrać animu :c'
                };
            }
        },

        //=======================================================
        // Pobierz opisu
        //=======================================================
        async GetDescription(id){
            try {
                const animeId = {anime: id}
                const response = await axios.get('/api/content/description', {params: animeId, withCredentials: true});
                return response.data;
            }
            catch(e){
                console.error('ERROR GET DESCRIPTION: ' + e);
                return null;
            }
        },

        //=======================================================
        // Aktualizacja statusu oglądania
        //=======================================================
        async UpdateStatus(id, data){
            try {
                if(await axios.patch('/api/content/anime', data, {params: {id: id}, withCredentials: true})) {
                    console.log("Zaktualizowano Status");
                }
                else {
                    console.error("Nie udało się zaktualizować statusu");
                }
            }
            catch(e){
                console.error('ERROR UPDATE: ' + e);
            }
        },

        //=======================================================
        // Przesyłanie grafiki na server
        //=======================================================
        async UploadImage(data) {
            try {
                const response = await axios.post('/api/content/image', data, {withCredentials: true});
                console.log(response)
                if(!response) {
                    return null;
                }
                return {url: response.data.url, status: response.status};
            }
            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ę zuploadować obrazu: ${e}`);
                return null;
            }
        },

        //=======================================================
        // Kasowanie grafiki
        //=======================================================
        async DeleteImage(data) {
            try {
                await axios.delete('/api/content/image', data, {withCredentials: true});
            }
            catch (e) {
                console.error(`Nie udało się skasować grafiki: ${e}`);
            }
        },

        //Dodawanie rekordu
        async AddAnimeToDataBase(data) {
            try {
                const respornse = await axios.post('/api/content/anime', data, {withCredentials: true});

                return respornse.data;
            }
            catch(e) {
                console.error(`Nie udało się wykodać operazji dodania anime: ${e}`);
                return false
            }
        },

        //Edytowanie rekordu
        async UpdateAnimeInDataBase(data) {
            try {
                const response = await axios.put('/api/content/anime', data, {withCredentials: true});
                return response.data;
            }
            catch(e) {
                console.error(`Nie udało się wykodać operazji edycji anime: ${e}`);
                return false
            }
        },

        //Pobieranie danych do edycji
        async GetAnimeForEditModal(anime) {
            try {
                const response = await axios.get('/api/content/anime', {params: {anime: anime}, withCredentials: true});
                console.log(response);
                return response.data;
            }
            catch(e) {
                console.error(`Nie udało się pobrać recordu: ${e}`);
                return null;
            }
        },

        //Pobierz grupę do edycji
        GetGroupForEditModal(group) {
            let result = {};

            this.group_storage.forEach(element => {
                if(element.gr_id == group) {
                    result = element.gr_title;
                }
            });

            return result;
        },

        //Dodaj nową grupę
        async AddGroupRecord(data) {
            try {
                const response = await axios.post('/api/content/group', data, {withCredentials: true});
                if(response.data.complete) {
                    await this.UpdateGroupList();
                }
                return response.data.complete;
            }
            catch(e) {
                console.error(`Nie udało się wykonać operacji ${e}`);
                return false;
            }
        },

        //Edytuj grupę
        async EditGroupRecord(data) {
            try {
                const response = await axios.put('/api/content/group', data, {withCredentials: true});
                if(response.data.complete) {
                    await this.UpdateGroupList();
                }
                return response.data.complete;
            }
            catch(e) {
                console.error(`Nie udało się wykonać operacji ${e}`);
                return false;
            }
        },

        //Aktualizacja listy grup
        async UpdateGroupList(){
            try {
                const response = await axios.get('/api/content/group', {withCredentials: true});
                this.group_storage = response.data;
            }
            catch(e) {
                console.error(`Nie udało się zaktualizować listy gróp: ${e}`);
            }
        },

        async DeleteRecords(data) {
            try {
                console.log(`TEST ${data.anime}`);
                const response = await axios.delete('/api/content/delete', {params: data, withCredentials: true});
                return response.data;
            }
            catch(e) {
                console.error(`Nie udało się skasować wpisów: ${e}`);
                return false
            }
        }
    },
});
