// app/context/AuthContext.tsx
"use client";

import {
  createContext,
  useContext,
  useState,
  useEffect,
  ReactNode,
  SetStateAction,
  Dispatch,
} from "react";
import { verifyToken } from "../utils/jwt-server";
import { userLogout } from "../utils/auth-token";
import { getStoreData } from "../utils/storagedata";
import { UserProfileModel } from "../types/models";

const AuthContext = createContext<{
  user: UserProfileModel | null;
  // setUser: (u: DecodedJWT | null) => void;
  setUser: Dispatch<SetStateAction<UserProfileModel | null>>;
  userToken: string | null;
  setUserToken: (u: string | null) => void;
  loading: boolean;
}>({
  user: null,
  setUser: () => {},
  userToken: null,
  setUserToken: () => null,
  loading: true,
});

export function AuthProvider({ children }: { children: ReactNode }) {
  const [user, setUser] = useState<UserProfileModel | null>(null);
  const [userToken, setUserToken] = useState<string | null>(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const checkToken = async () => {
      const token = await getStoreData<string>("token");
      if (!token) {
        setLoading(false);
        return;
      }
      const verified = verifyToken(token);
      if (verified?.expired) {
        setUser(null);
        setUserToken(null);
        userLogout();
      } else {
        setUserToken(token);
        const userData = await getStoreData<UserProfileModel>("user");
        setUser(userData ?? null);
      }
      setLoading(false);
    };

    checkToken();
  }, []);

  return (
    <AuthContext.Provider
      value={{ user, setUser, userToken, setUserToken, loading }}
    >
      {children}
    </AuthContext.Provider>
  );
}

export const useAuth = () => useContext(AuthContext);
