"use client";

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

import { fetchPlatformBranding } from "@/lib/api/branding";
import type { PlatformSettings } from "@/types/settings";

type PlatformBrandingContextValue = {
  branding: PlatformSettings | null;
  loading: boolean;
  error: string | null;
  refresh: () => Promise<void>;
  setBranding: (next: PlatformSettings) => void;
};

const PlatformBrandingContext = createContext<PlatformBrandingContextValue | null>(null);

type PlatformBrandingProviderProps = {
  children: ReactNode;
  setDocumentTitle?: boolean;
};

export function PlatformBrandingProvider({ children, setDocumentTitle = false }: PlatformBrandingProviderProps) {
  const [branding, setBrandingState] = useState<PlatformSettings | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  const refresh = useCallback(async () => {
    try {
      setLoading(true);
      setError(null);
      const next = await fetchPlatformBranding();
      setBrandingState(next);
    } catch (err) {
      const message = err instanceof Error ? err.message : "Failed to load platform branding";
      setError(message);
    } finally {
      setLoading(false);
    }
  }, []);

  const setBranding = useCallback((next: PlatformSettings) => {
    setBrandingState(next);
  }, []);

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

  useEffect(() => {
    if (!setDocumentTitle) return;
    const title = branding?.display_name?.trim();
    if (!title) return;
    document.title = title;
  }, [branding?.display_name, setDocumentTitle]);

  const value = useMemo<PlatformBrandingContextValue>(
    () => ({
      branding,
      loading,
      error,
      refresh,
      setBranding,
    }),
    [branding, error, loading, refresh, setBranding],
  );

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

export function usePlatformBranding() {
  const value = useContext(PlatformBrandingContext);
  if (!value) {
    throw new Error("usePlatformBranding must be used within a PlatformBrandingProvider");
  }
  return value;
}

