import { createContext, useState, useEffect, type ReactNode } from "react";
import { authLogin } from "../services/auth.service";
import type { ILoginInput, ILoginResUser } from "../types";
import { getAxiosErrorMessage } from "../utils/index.utils";
import { useNavigate } from "react-router-dom";
import toast from "react-hot-toast";

interface AuthContextType {
  isAuthenticated: boolean;
  user: ILoginResUser | null;
  loading: boolean;
  login: (user: ILoginInput) => void;
  logout: () => void;
  isInstitution: boolean;
  updateUser: (user: ILoginResUser) => void;
}

export const AuthContext = createContext<AuthContextType | undefined>(
  undefined,
);

export const AuthProvider: React.FC<{ children: ReactNode }> = ({
  children,
}) => {
  const [user, setUser] = useState<ILoginResUser | null>(null);
  const [token, setToken] = useState<string | null>(null);
  const [loading, setLoading] = useState(true);
  const [isInstitution, setIsInstitution] = useState(false);
  const navigate = useNavigate();

  useEffect(() => {
    try {
      const storedUser = JSON.parse(localStorage.getItem("user"));
      const storedToken = localStorage.getItem("token");
      if (storedUser) {
        setUser(storedUser);
        setIsInstitution(storedUser.role.toLowerCase() === "institution");
      }
      if (storedToken) {
        setToken(storedToken);
      }
    } catch (e) {
      console.warn("Failed to parse stored auth data, clearing localStorage.", e);
      localStorage.removeItem("user");
      localStorage.removeItem("token");
    } finally {
      setLoading(false);
    }
  }, []);

  const login = async (payload: ILoginInput) => {
    try {
      const response = await authLogin(payload);

      const { token, user, message: msg } = response;

      localStorage.setItem("token", token);
      localStorage.setItem("user", JSON.stringify(user));

      setUser(user);
      setToken(token);
      setIsInstitution(user.role.toLowerCase() === "institution");

      toast.success(msg);
      navigate("/");
    } catch (error) {
      toast.error(getAxiosErrorMessage(error));
    }
  };

  const logout = () => {
    localStorage.removeItem("token");
    localStorage.removeItem("user");
    setUser(null);
    setToken(null);
    toast.success("Logout successfully");
  };

  const updateUser = (val: ILoginResUser) => {
    localStorage.setItem("user", JSON.stringify(val));
    setUser(val);
  };

  return (
    <AuthContext.Provider
      value={{
        isAuthenticated: !!token,
        user,
        loading,
        login,
        logout,
        isInstitution,
        updateUser,
      }}
    >
      {children}
    </AuthContext.Provider>
  );
};
