import { useEffect, useState } from "react";
import authStorage from "@/server_api/storage"
import { signOut } from "next-auth/react"

interface UserDetails {
    id: string;
    userId: string;
    userType: string;
    email: string;
    token?: string;
}

interface AuthMethods {
    setLogIn: (userDetails: UserDetails, JWT_Token: string) => void;
    setLogOut: () => void;
}

const useAuth = (): { user: UserDetails | null, isLoading: boolean } & AuthMethods & {
    setUser: React.Dispatch<React.SetStateAction<UserDetails | null>>;
} => {
    const [user, setUser] = useState<UserDetails | null>(null);
    const [isLoading, setIsLoading] = useState(true);

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

    const setLogIn = (userDetails: UserDetails, token: string): void => {
        setUser(userDetails);
        authStorage.storeUser(userDetails);
    };

    const setLogOut = (): void => {
        setUser(null);
        signOut();
        authStorage.deleteUser();
    };

    const loadUserSession = async () => {
        try {
            const user_ = await authStorage.getUser();
            setUser(user_);
        } catch (error) {
            console.error("Failed to load user session", error);
        } finally {
            setIsLoading(false);
        }
    };

    return { user, setLogIn, setLogOut, setUser, isLoading };
};

export default useAuth;
