// src/lib/keywords/site-context.tsx
"use client";

import { useRouter } from "next/navigation";
import { createContext, useCallback, useContext, useState } from "react";
import { writeActiveSiteCookie } from "@/lib/sites/active-site-client";
import type { Site } from "./types";

interface SiteContextValue {
  activeSiteId: string;
  activeSite: Site | undefined;
  setActiveSiteId: (id: string) => void;
  addSite: (site: Site) => void;
  updateSite: (site: Site) => void;
  removeSite: (id: string) => void;
  sites: Site[];
}

const SiteContext = createContext<SiteContextValue | null>(null);

export function SiteProvider({
  initialSites,
  initialActiveSiteId,
  children,
}: {
  initialSites: Site[];
  // Resolved server-side from the active-site cookie (no localStorage / hydration flicker).
  initialActiveSiteId: string;
  children: React.ReactNode;
}) {
  const router = useRouter();
  const [sites, setSites] = useState<Site[]>(initialSites);
  const [activeSiteId, setActiveSiteIdState] = useState<string>(
    initialActiveSiteId || (initialSites[0]?.id ?? ""),
  );

  // Switching writes the cookie + re-runs Server Components so the new site's
  // data is fetched on the server (no client waterfall).
  const setActiveSiteId = useCallback(
    (id: string) => {
      setActiveSiteIdState(id);
      writeActiveSiteCookie(id);
      router.refresh();
    },
    [router],
  );

  const activeSite = sites.find((s) => s.id === activeSiteId) ?? sites[0];

  function addSite(site: Site) {
    setSites((prev) => [...prev, site]);
    setActiveSiteId(site.id);
  }

  function updateSite(site: Site) {
    setSites((prev) => prev.map((s) => (s.id === site.id ? site : s)));
  }

  function removeSite(id: string) {
    const remaining = sites.filter((s) => s.id !== id);
    setSites(remaining);
    // If the deleted site was active, switch to the first remaining one (or
    // clear when none are left). The cookie write + router.refresh run HERE in
    // the event handler — never inside a setState updater, which React invokes
    // during render and would trigger "Cannot update Router while rendering".
    if (activeSiteId === id) {
      const next = remaining[0]?.id ?? "";
      setActiveSiteIdState(next);
      writeActiveSiteCookie(next);
      router.refresh();
    }
  }

  return (
    <SiteContext
      value={{
        activeSiteId: activeSite?.id ?? "",
        activeSite,
        setActiveSiteId,
        addSite,
        updateSite,
        removeSite,
        sites,
      }}
    >
      {children}
    </SiteContext>
  );
}

export function useActiveSite(): SiteContextValue {
  const ctx = useContext(SiteContext);
  if (!ctx) throw new Error("useActiveSite must be used within SiteProvider");
  return ctx;
}
