import { DefineStoreOptions, defineStore } from "pinia";

interface CacheItem {
    url: string;
    data: unknown;
}

export const useCacheStore = defineStore({
    id: "cache",
    state: () => ({
        cache: [] as CacheItem[],
    }),

    actions: {
        // Method to retrieve cached JSON data based on a URL
        getCacheByUrl(url: string) {
            const cachedItem = this.cache.find((item) => item.url === url);
            return cachedItem ? cachedItem.data : null;
        },

        // Method to update the cache with new data and check for modifications
        updateCache(url: string, newData: unknown): boolean {
            const index = this.cache.findIndex((item) => item.url === url);

            if (index !== -1) {
                // If the URL is already in the cache, check for modifications
                const existingData = this.cache[index].data;

                if (JSON.stringify(existingData) === JSON.stringify(newData)) {
                    // Data is not modified, return false
                    return false;
                } else {
                    // Data is modified, update the cache
                    this.cache[index].data = newData;
                    return true;
                }
            } else {
                // If the URL is not in the cache, add it
                this.cache.push({ url, data: newData });
                return true;
            }
        },

        // Method to clear the cache for a specific URL
        clearCacheByUrl(url: string) {
            const index = this.cache.findIndex((item) => item.url === url);
            if (index !== -1) {
                this.cache.splice(index, 1);
            }
        },

        // Method to clear the entire cache
        clearCache() {
            this.cache = [];
        },
    },

    persist: true,
} as DefineStoreOptions<string, unknown, unknown, unknown> & {
    persist?: boolean;
});
