import { useCallback, useEffect, useState } from "react";
import {
  COMPONENT_LIBRARY_UPDATED_EVENT,
  COMPONENT_LIBRARY_VERSION_KEY,
  fetchAdminComponentDefaults,
  fetchPublicComponentDefaults,
  readComponentLibraryVersion,
} from "@/lib/componentDefaults";
import type { ComponentLibraryRecord } from "@/lib/mergeBlockContent";
import { SITE_SETTINGS_UPDATED_EVENT, SITE_SETTINGS_VERSION_KEY } from "@/lib/siteSettings";

type UseComponentDefaultsOptions = {
  source?: "public" | "admin";
  enabled?: boolean;
};

export function useComponentDefaults(options: UseComponentDefaultsOptions = {}) {
  const { source = "public", enabled = true } = options;
  const [components, setComponents] = useState<ComponentLibraryRecord[]>([]);
  const [loading, setLoading] = useState(enabled);
  const [error, setError] = useState<string | null>(null);
  const [version, setVersion] = useState<string | null>(() => readComponentLibraryVersion());

  const refresh = useCallback(async () => {
    if (!enabled) return;
    setError(null);
    try {
      const data =
        source === "admin" ? await fetchAdminComponentDefaults() : await fetchPublicComponentDefaults();
      setComponents(data);
    } catch (e) {
      setError(e instanceof Error ? e.message : "Failed to load component defaults");
      setComponents([]);
    } finally {
      setLoading(false);
    }
  }, [enabled, source]);

  useEffect(() => {
    if (!enabled) return;
    void refresh();
  }, [enabled, refresh, version]);

  useEffect(() => {
    if (!enabled) return;

    const bump = () => setVersion(readComponentLibraryVersion());

    const onFocus = () => {
      void refresh();
    };

    window.addEventListener(COMPONENT_LIBRARY_UPDATED_EVENT, bump);
    window.addEventListener(SITE_SETTINGS_UPDATED_EVENT, onFocus);
    window.addEventListener("focus", onFocus);
    const onStorage = (event: StorageEvent) => {
      if (
        event.key === COMPONENT_LIBRARY_VERSION_KEY ||
        event.key === SITE_SETTINGS_VERSION_KEY
      ) {
        bump();
        void refresh();
      }
    };
    window.addEventListener("storage", onStorage);

    return () => {
      window.removeEventListener(COMPONENT_LIBRARY_UPDATED_EVENT, bump);
      window.removeEventListener(SITE_SETTINGS_UPDATED_EVENT, onFocus);
      window.removeEventListener("focus", onFocus);
      window.removeEventListener("storage", onStorage);
    };
  }, [enabled, refresh]);

  return { components, loading, error, refresh };
}
