"use client";

import { useState, useCallback, useEffect } from "react";

export interface Repository {
  id: string;
  name: string;
  source_type: "path" | "zip" | "git";
  source_path: string;
  source_origin: string;
  description: string | null;
  created_at: string;
  updated_at: string;
}

export function useRepositories() {
  const [repositories, setRepositories] = useState<Repository[]>([]);
  const [loading, setLoading] = useState(true);

  const refresh = useCallback(async () => {
    try {
      const res = await fetch("/api/repositories");
      if (res.ok) setRepositories(await res.json());
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => { refresh(); }, [refresh]);

  const addRepository = useCallback(
    async (data: {
      name: string;
      source_type: "path" | "zip" | "git";
      description?: string;
      source_path?: string;
      git_url?: string;
      zip_file?: File;
    }) => {
      let res: Response;

      if (data.source_type === "zip" && data.zip_file) {
        // Use FormData for zip uploads to avoid base64 size limits
        const formData = new FormData();
        formData.append("name", data.name);
        formData.append("source_type", "zip");
        if (data.description) formData.append("description", data.description);
        formData.append("zip_file", data.zip_file);
        res = await fetch("/api/repositories", {
          method: "POST",
          body: formData,
        });
      } else {
        res = await fetch("/api/repositories", {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify(data),
        });
      }

      if (!res.ok) {
        const err = await res.json();
        throw new Error(err.error || "Failed to create repository");
      }
      const repo = await res.json();
      await refresh();
      return repo as Repository;
    },
    [refresh],
  );

  const deleteRepository = useCallback(
    async (id: string) => {
      await fetch(`/api/repositories/${id}`, { method: "DELETE" });
      await refresh();
    },
    [refresh],
  );

  return { repositories, loading, refresh, addRepository, deleteRepository };
}
