"use client";

import {
  createContext,
  ReactNode,
  useCallback,
  useContext,
  useEffect,
  useMemo,
  useState,
} from "react";
import { Branding, DEFAULT_BRANDING } from "./types";

export interface BrandingContextValue {
  branding: Branding;
  refreshBranding: () => Promise<void>;
  setBranding: (value: Branding) => void;
}

const BrandingContext = createContext<BrandingContextValue | null>(null);

export function BrandingProvider({
  children,
  fetchBranding,
  fallback = DEFAULT_BRANDING,
}: {
  children: ReactNode;
  fetchBranding: () => Promise<Branding>;
  fallback?: Branding;
}) {
  const [branding, setBranding] = useState<Branding>(fallback);

  const refreshBranding = useCallback(async () => {
    try {
      const data = await fetchBranding();
      setBranding(data);
    } catch {
      setBranding(fallback);
    }
  }, [fetchBranding, fallback]);

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

  const value = useMemo(
    () => ({ branding, refreshBranding, setBranding }),
    [branding, refreshBranding],
  );

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

export function useBrandingContext(): BrandingContextValue {
  const ctx = useContext(BrandingContext);
  if (!ctx) {
    return {
      branding: DEFAULT_BRANDING,
      refreshBranding: async () => {},
      setBranding: () => {},
    };
  }
  return ctx;
}

export function useBranding(): Branding {
  return useBrandingContext().branding;
}
