"use client";

import { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from "react";
import { api } from "@/lib/api";
import type { Me } from "@/lib/types";

interface SessionValue {
  me: Me | null;
  loading: boolean;
  refresh: () => Promise<void>;
  can: (permission: string) => boolean;
}

const SessionContext = createContext<SessionValue>({ me: null, loading: true, refresh: async () => {}, can: () => false });

export function SessionProvider({ children }: { children: ReactNode }) {
  const [me, setMe] = useState<Me | null>(null);
  const [loading, setLoading] = useState(true);
  const refresh = useCallback(async () => {
    try {
      setMe(await api.get<Me>("/auth/me"));
    } finally {
      setLoading(false);
    }
  }, []);
  useEffect(() => {
    refresh();
  }, [refresh]);
  const can = useCallback((p: string) => Boolean(me?.permissions.includes(p)), [me]);
  return <SessionContext.Provider value={{ me, loading, refresh, can }}>{children}</SessionContext.Provider>;
}

export const useSession = () => useContext(SessionContext);
