"use client";

import { useState, useEffect, useCallback, useRef } from "react";
import type { WikiManifest, WikiPage } from "@optage/sdk/client";

export function useWiki(repositoryId: string | null) {
  const [manifest, setManifest] = useState<WikiManifest | null>(null);
  const [selectedPageId, setSelectedPageId] = useState<string | null>(null);
  const [page, setPage] = useState<WikiPage | null>(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);
  const bootstrappedRef = useRef(false);

  const refreshManifest = useCallback(async () => {
    if (!repositoryId) {
      setManifest(null);
      return;
    }

    try {
      const res = await fetch(`/api/repositories/${repositoryId}/wiki/manifest`);
      if (!res.ok) {
        setManifest(null);
        return;
      }
      const data = (await res.json()) as WikiManifest;
      setManifest(data);
    } catch {
      setManifest(null);
    }
  }, [repositoryId]);

  useEffect(() => {
    if (!repositoryId) {
      setManifest(null);
      setSelectedPageId(null);
      setPage(null);
      setError(null);
      return;
    }

    if (bootstrappedRef.current) {
      bootstrappedRef.current = false;
      setSelectedPageId(null);
      setPage(null);
      setError(null);
      return;
    }

    setSelectedPageId(null);
    setPage(null);
    setError(null);
    refreshManifest();
  }, [repositoryId, refreshManifest]);

  const initManifest = useCallback((m: WikiManifest | null) => {
    setManifest(m);
  }, []);

  const markBootstrapped = useCallback(() => {
    bootstrappedRef.current = true;
  }, []);

  const selectPage = useCallback(
    async (pageId: string) => {
      if (!repositoryId) return;

      setSelectedPageId(pageId);
      setLoading(true);
      setError(null);

      try {
        const res = await fetch(
          `/api/repositories/${repositoryId}/wiki/pages/${encodeURIComponent(pageId)}`,
        );
        if (!res.ok) {
          let message = "Failed to load wiki page";
          try {
            const data = await res.json();
            if (typeof data?.error === "string" && data.error.length > 0) {
              message = data.error;
            }
          } catch {
            // Keep generic error.
          }
          setError(message);
          setPage(null);
          return;
        }

        const data = (await res.json()) as WikiPage;
        setError(null);
        setPage(data);
      } catch {
        setError("Failed to load wiki page");
        setPage(null);
      } finally {
        setLoading(false);
      }
    },
    [repositoryId],
  );

  useEffect(() => {
    if (!manifest || !repositoryId || selectedPageId) return;
    selectPage(manifest.rootPageId);
  }, [manifest, repositoryId, selectedPageId, selectPage]);

  return {
    manifest,
    selectedPageId,
    page,
    loading,
    error,
    selectPage,
    isAvailable: manifest !== null,
    refreshManifest,
    initManifest,
    markBootstrapped,
  };
}
