"use client";

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

export interface User {
  id: number;
  name: string;
  email: string;
  contactNo: string;
  birthDate?: string;
  birthPlace?: string;
  location?: string;
  gender?: string;
}

interface AuthContextType {
  user: User | null;
  token: string | null;
  loading: boolean;
  login: (
    token: string,
    refreshToken: string,
    user: User
  ) => void;
  logout: () => void;
}

const AuthContext = createContext<AuthContextType | null>(null);

export function AuthProvider({
  children,
}: {
  children: React.ReactNode;
}) {
  const router = useRouter();

  const [user, setUser] = useState<User | null>(null);

  const [token, setToken] = useState<string | null>(null);

  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const jwt = localStorage.getItem("token");

    const userData = localStorage.getItem("user");

    if (jwt && userData) {
      setToken(jwt);
      setUser(JSON.parse(userData));
    }

    setLoading(false);
  }, []);

  const login = (
    jwt: string,
    refreshToken: string,
    user: User
  ) => {
    localStorage.setItem("token", jwt);

    localStorage.setItem(
      "refreshToken",
      refreshToken
    );

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

    setToken(jwt);

    setUser(user);
  };

  const logout = () => {
    localStorage.clear();

    setUser(null);

    setToken(null);

    router.push("/signin");
  };

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

export function useAuth() {
  const context = useContext(AuthContext);

  if (!context) {
    throw new Error(
      "useAuth must be used inside AuthProvider"
    );
  }

  return context;
}