"use client";

import UserSession from "@/models/user-session";
import { ReactNode, createContext, useContext, useState, useCallback, useMemo } from "react";

type SessionContextValue = {
  session: UserSession | null;
  setSession: (s: UserSession | null) => void;
  clearSession: () => void;
};

const SessionContext = createContext<SessionContextValue>({
  session: null,
  setSession: () => {},
  clearSession: () => {},
});

type SessionProviderProps = {
  session: UserSession | null;
  children: ReactNode;
};

export default function SessionProvider({
  session: initialSession,
  children,
}: SessionProviderProps) {
  const [session, setSessionState] = useState<UserSession | null>(initialSession);

  const setSession = useCallback((s: UserSession | null) => {
    setSessionState(s);
  }, []);

  const clearSession = useCallback(() => {
    setSessionState(null);
  }, []);

  const value = useMemo(
    () => ({ session, setSession, clearSession }),
    [session, setSession, clearSession],
  );

  return (
    <SessionContext.Provider value={value}>
      {children}
    </SessionContext.Provider>
  );
}

export function useSession() {
  return useContext(SessionContext).session;
}

export function useSessionActions() {
  const { setSession, clearSession } = useContext(SessionContext);
  return { setSession, clearSession };
}
