"use client";

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

import type { RgcDecisionRow } from "../data/rgc-decision-data";

import {
  getCdcRgcDecisionLookups,
  getCdcRgcDecisions,
  type RgcDecisionLookupOption,
} from "../service/rgc-decision-service";

export function useRgcDecisionList() {
  const [rows, setRows] =
    useState<RgcDecisionRow[]>([]);

  const [plenaries, setPlenaries] =
    useState<RgcDecisionLookupOption[]>(
      [],
    );

  const [ministries, setMinistries] =
    useState<RgcDecisionLookupOption[]>(
      [],
    );

  const [categories, setCategories] =
    useState<RgcDecisionLookupOption[]>(
      [],
    );

  const [isLoading, setIsLoading] =
    useState(true);

  const [error, setError] =
    useState<string | null>(null);

  const reload = useCallback(async () => {
    try {
      setIsLoading(true);
      setError(null);

      const [
        nextRows,
        lookups,
      ] = await Promise.all([
        getCdcRgcDecisions(),
        getCdcRgcDecisionLookups(),
      ]);

      setRows(
        Array.isArray(nextRows)
          ? nextRows
          : [],
      );

      setPlenaries(
        Array.isArray(
          lookups?.plenaries,
        )
          ? lookups.plenaries
          : [],
      );

      setMinistries(
        Array.isArray(
          lookups?.ministries,
        )
          ? lookups.ministries
          : [],
      );

      setCategories(
        Array.isArray(
          lookups?.categories,
        )
          ? lookups.categories
          : [],
      );
    } catch (requestError) {
      setRows([]);
      setPlenaries([]);
      setMinistries([]);
      setCategories([]);

      setError(
        requestError instanceof Error
          ? requestError.message
          : "Unable to load RGC Decisions.",
      );
    } finally {
      setIsLoading(false);
    }
  }, []);

  useEffect(() => {
    void reload();
  }, [reload]);

  return {
    rows,
    plenaries,
    ministries,
    categories,
    isLoading,
    error,
    reload,
  };
}

export default useRgcDecisionList;