"use client";

import {
  createContext,
  useCallback,
  useContext,
  useEffect,
  useMemo,
  useState,
  type ReactNode,
} from "react";

type AdminState = {
  loading: boolean;
  authenticated: boolean;
  email: string | null;
  refresh: () => Promise<void>;
  logout: () => Promise<void>;
};

const AdminContext = createContext<AdminState | null>(null);

export function AdminProvider({ children }: { children: ReactNode }) {
  const [loading, setLoading] = useState(true);
  const [authenticated, setAuthenticated] = useState(false);
  const [email, setEmail] = useState<string | null>(null);

  const refresh = useCallback(async () => {
    try {
      const res = await fetch("/api/ops/me", { cache: "no-store" });
      if (!res.ok) {
        setAuthenticated(false);
        setEmail(null);
        return;
      }
      const data = (await res.json()) as { email?: string };
      setAuthenticated(true);
      setEmail(data.email || "admin@ot.azulado.cloud");
    } catch {
      setAuthenticated(false);
      setEmail(null);
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => {
    refresh();
  }, [refresh]);

  const logout = useCallback(async () => {
    await fetch("/api/ops/login", { method: "DELETE" });
    setAuthenticated(false);
    setEmail(null);
  }, []);

  const value = useMemo(
    () => ({ loading, authenticated, email, refresh, logout }),
    [loading, authenticated, email, refresh, logout]
  );

  return <AdminContext.Provider value={value}>{children}</AdminContext.Provider>;
}

export function useAdmin() {
  const ctx = useContext(AdminContext);
  if (!ctx) throw new Error("useAdmin must be used within AdminProvider");
  return ctx;
}
