import { useState, useCallback } from 'react';
import type { ReactText } from 'react';
import { useDeepCompareEffect } from '@ant-design/pro-utils';
import type { SortOrder } from 'antd/lib/table/interface';
import { requestList, fieldsToGql, fragmentsToGql } from '@/generated/services/utils';

import type { FieldsType, FragmentsType } from '@/generated/services/utils';
import { getFields } from '@/generated/services/utils';

export default function useRequestList(
  table: string,
  params: any,
  sorter?: Record<string, SortOrder>,
  filter?: Record<string, ReactText[] | null>,
  fields?: FieldsType,
  fragments?: FragmentsType,
) {
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<Error | null>(null);
  const [data, setData] = useState<any>(null);
  const [runCount, setRunCount] = useState(0);

  useDeepCompareEffect(() => {
    const fetchData = async () => {
      try {
        setLoading(true);
        const defaultFields = getFields(table);
        const fieldsGql = fieldsToGql(fields || defaultFields);
        const fragmentsGql = fragmentsToGql(fragments);
        const response = await requestList(table, fieldsGql, params, sorter, filter, fragmentsGql);
        setData(response.data);
        setLoading(false);
        setError(null);
      } catch (e: any) {
        setData(null);
        setLoading(false);
        setError(e);
      }
    };

    fetchData();
  }, [table, params, sorter, filter, fields, fragments, runCount]);

  const run = useCallback(() => {
    setRunCount((value) => value + 1);
  }, []);

  return { data, loading, error, run };
}
