import { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from "react";
import { useQuery } from "@tanstack/react-query";
import { useServerFn } from "@tanstack/react-start";
import { listBusinesses } from "@/lib/partner.functions";

type Business = Awaited<ReturnType<typeof listBusinesses>>[number];

type Ctx = {
  businesses: Business[];
  active: Business | null;
  activeId: string | null;
  setActiveId: (id: string) => void;
  isLoading: boolean;
  isFetching: boolean;
  refetch: () => void;
};

const BusinessContext = createContext<Ctx | null>(null);
const STORAGE_KEY = "airfis.activeBusinessId";

export function BusinessProvider({ children }: { children: ReactNode }) {
  const fetchBusinesses = useServerFn(listBusinesses);
  const { data, isLoading, isFetching, refetch } = useQuery({
    queryKey: ["partner", "businesses"],
    queryFn: () => fetchBusinesses(),
  });

  const [activeId, setActiveIdState] = useState<string | null>(null);

  useEffect(() => {
    const stored = typeof window !== "undefined" ? window.localStorage.getItem(STORAGE_KEY) : null;
    if (stored) setActiveIdState(stored);
  }, []);

  const businesses = useMemo(() => data ?? [], [data]);

  useEffect(() => {
    if (!businesses.length) return;
    if (!activeId || !businesses.some((b) => b.id === activeId)) {
      setActiveIdState(businesses[0]!.id);
    }
  }, [businesses, activeId]);

  function setActiveId(id: string) {
    setActiveIdState(id);
    if (typeof window !== "undefined") window.localStorage.setItem(STORAGE_KEY, id);
  }

  const active = businesses.find((b) => b.id === activeId) ?? businesses[0] ?? null;

  return (
    <BusinessContext.Provider
      value={{
        businesses,
        active,
        activeId: active?.id ?? null,
        setActiveId,
        isLoading,
        isFetching,
        refetch,
      }}
    >
      {children}
    </BusinessContext.Provider>
  );
}

export function useBusiness() {
  const ctx = useContext(BusinessContext);
  if (!ctx) throw new Error("useBusiness must be used inside BusinessProvider");
  return ctx;
}

export function businessLabel(b: { business_name?: string | null; shop_name?: string | null }) {
  return b.shop_name || b.business_name || "Untitled business";
}
