import { useState, useCallback } from 'react';
import { useDeepCompareEffect } from '@ant-design/pro-utils';
import { requestAggregate, aggregateFieldsToGql } from '@/generated/services/utils';
import type { AggregateFieldsType } from '@/generated/services/utils';

export default function useRequestAggregate(
  table: string,
  params: any,
  fields: AggregateFieldsType,
) {
  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 fieldsGql = aggregateFieldsToGql(fields);
        const response = await requestAggregate(table, fieldsGql, params);
        setData(response.data);
        setLoading(false);
        setError(null);
      } catch (e: any) {
        setData(null);
        setLoading(false);
        setError(e);
      }
    };

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

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

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