"use client";

import { useRouter } from "next/navigation";
import Swal from "sweetalert2";
import {
    createContext,
    useContext,
    useEffect,
    useState
} from "react";

interface User {
    name:string;
}

interface UserContextType {
    user:User|null;
    loading:boolean;
    refreshUser:()=>void;
}

const UserContext =
createContext<UserContextType|null>(null);

export function UserProvider({
    children
}:{
    children:React.ReactNode
}) {
    const [user,setUser] = useState<User|null>(null);
    const [loading,setLoading] = useState(true);
    const router = useRouter();

    const getUser = async()=>{
        try {
            const res =
                await fetch("/api/auth/me", {
                        cache:"no-store"
                    }
                );

            const data = await res.json();
            if(data.result){
                setUser(data.data);
            }else{
                setUser(null);
                logout()
            }
        }catch{
            setUser(null);
            logout()
        }
        finally{
            setLoading(false);
        }
    }

    useEffect(()=>{
        getUser();
    },[]);

    const logout = async () => {
        try {
            const res = await fetch("/api/auth/logout", {
                    method: "POST",
                }
            );

            router.replace("/login");
            router.refresh();
        } catch {
            Swal.fire({
                icon:"error",
                title:"Error",
                text:"Failed logout",
            });
        }
    }

    return (
        <UserContext.Provider
            value={{
                user,
                loading,
                refreshUser:getUser
            }}>
            {children}
        </UserContext.Provider>
    )
}

export function useUser(){
    const ctx = useContext(UserContext);
    if(!ctx){
        throw new Error("useUser must be inside UserProvider");
    }
    return ctx;
}