import { ConvertJSONToFormData, ServerRequest } from "@/lib/actions";
import React, { useEffect } from "react";
import { filtersManager } from "../util/filters";

type UseTableFiltersProps = {
  id: string;
  searchFields: string[];
  fetch: (formData: FormData) => Promise<string>;
  initialFilters?: Partial<TableFilters>;
};
export const useTableFilters = ({
  id,
  searchFields,
  fetch,
  initialFilters,
}: UseTableFiltersProps) => {
  const [count, setCount] = React.useState<number>();
  const [list, setList] = React.useState<any>("loading");

  const [filters, setFilters] = React.useState<TableFilters>(() => ({
    ...filtersManager.storage.load(id, searchFields),
    ...initialFilters,
  }));

  const processFilters = React.useCallback(
    (currentFilters: TableFilters) => {
      const validateFilters = filtersManager.pagination.min(currentFilters);
      filtersManager.storage.save(id, validateFilters);
      return validateFilters;
    },
    [id],
  );

  const fetchData = async () => {
    const auxFilters = processFilters(filters);
    const formData = ConvertJSONToFormData(auxFilters);

    const result = await ServerRequest<FetchTableBuilder>(fetch(formData));

    if (!result.operation) {
      return setList("error");
    }

    if (result.data.list.length === 0 && result.data.count === 0) {
      setCount(0);
      return setList("empty");
    }

    if (result.data.list.length === 0 && result.data.count > 0) {
      return setFilters((prev) => {
        const copy = { ...prev };

        const lastPageIndex = Math.floor(
          (result.data.count - 1) / copy.pagination.pageSize,
        );
        copy.pagination.pageIndex = lastPageIndex;

        return copy;
      });
    }

    filtersManager.pagination.max(result.data.count, auxFilters, setFilters);

    if (result.data.count !== count) {
      setCount(result.data.count);
    }

    setList(result.data.list);
  };

  useEffect(() => {
    fetchData();

    return () => {
      setList("loading");
    };
  }, [filters]);

  return {
    list,
    count,
    filters,
    fetchData,
    setList,
    setFilters,
  };
};
