import { useState, useCallback } from 'react';
import { useDeepCompareEffect } from '@ant-design/pro-utils';
import { requestInfo, fieldsToGql, fragmentsToGql } from '@/generated/services/utils';
import type { FieldsType, FragmentsType } from '@/generated/services/utils';
import { getFields } from '@/generated/services/utils';

export default function useRequestInfo(
  table: string,
  id?: string | number,
  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 () => {
      if (!id) {
        setData(null);
        setLoading(false);
        setError(null);
        return;
      }

      try {
        setLoading(true);
        const defaultFields = getFields(table);
        const fieldsGql = fieldsToGql(fields || defaultFields);
        const fragmentsGql = fragmentsToGql(fragments);
        const response = await requestInfo(table, id, fieldsGql, fragmentsGql);
        setData(response.data);
        setLoading(false);
        setError(null);
      } catch (e: any) {
        setData(null);
        setLoading(false);
        setError(e);
      }
    };

    fetchData();
  }, [table, id, fields, fragments, runCount]);

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

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