import {useEffect, useState} from "react";
import {toastError} from "../services/toaster";

type AsyncFn<T> = () => Promise<T>;

function WOLD_useAsyncCache<T>(asyncFn: AsyncFn<T>, cacheKey: string): [T | null, boolean] {
    const [data, setData] = useState<T | null>(null);
    const [isLoading, setIsLoading] = useState<boolean>(false);

    useEffect(() => {
        const fetchData = async () => {
            try {
                const cachedData = localStorage.getItem(cacheKey);
                if (cachedData) {
                    setData(JSON.parse(cachedData) as T);
                } else {
                    setIsLoading(true);
                    const result = await asyncFn();
                    setData(result);
                    localStorage.setItem(cacheKey, JSON.stringify(result));
                }
            } catch (error) {
                toastError("Φαίνεται ότι η ενέργεια δεν ολοκληρώθηκε. Παρακαλούμε προσπαθήστε ξανά.");
                console.error(error);
            } finally {
                setIsLoading(false);
            }
        };

        fetchData();
    }, [asyncFn, cacheKey]);

    return [data, isLoading];
}

export default WOLD_useAsyncCache;
