"use client";

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

import type { PlenaryRecord } from "../../plenary-data";
import {
  getMinistryPlenaries,
  getMinistryPlenaryDetail,
} from "../service/ministry-plenary-service";

function getErrorMessage(error: unknown, fallback: string) {
  if (error instanceof Error && error.message.trim()) {
    return error.message;
  }

  return fallback;
}

export function useMinistryPlenaries() {
  const [items, setItems] = useState<PlenaryRecord[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState("");

  const refetch = useCallback(async () => {
    try {
      setLoading(true);
      setError("");

      const data = await getMinistryPlenaries();
      setItems(data);
    } catch (err: unknown) {
      setItems([]);
      setError(getErrorMessage(err, "Failed to load plenaries."));
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => {
    // eslint-disable-next-line react-hooks/set-state-in-effect -- initial data fetch
    void refetch();
  }, [refetch]);

  return {
    items,
    loading,
    error,
    refetch,
  };
}

export function useMinistryPlenaryDetail(plenaryId: number) {
  const [item, setItem] = useState<PlenaryRecord | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState("");

  const refetch = useCallback(async () => {
    if (!plenaryId || Number.isNaN(plenaryId)) {
      setItem(null);
      setLoading(false);
      setError("");
      return;
    }

    try {
      setLoading(true);
      setError("");

      const data = await getMinistryPlenaryDetail(plenaryId);
      setItem(data);
    } catch (err: unknown) {
      setItem(null);
      setError(getErrorMessage(err, "Failed to load plenary detail."));
    } finally {
      setLoading(false);
    }
  }, [plenaryId]);

  useEffect(() => {
    // eslint-disable-next-line react-hooks/set-state-in-effect -- initial data fetch
    void refetch();
  }, [refetch]);

  return {
    item,
    loading,
    error,
    refetch,
  };
}