import { useEffect, useState } from 'react';
import { dataOriginRequest, dataOriginStatic } from '@/common/util/const';

import { calculateTextExprValue } from '@/common/util/util';
import { makeRequest } from '@/common/manager/request';

export function useData(config) {
  const [data, setData] = useState();
  const { dataFrom, _context, isDesign, designMockData } = config || {};
  const { dataOrigin, dataSource, requestConfig } = dataFrom || {};

  const calculateData = async () => {
    if (dataOrigin === dataOriginStatic) {
      return calculateTextExprValue(dataSource, {
        recordDataSource: {},
        state: _context?.state,
      });
    } else if (dataOrigin === dataOriginRequest) {
      return makeRequest({
        buttonConfig: {
          options: {
            requestConfig,
          },
        },
        recordDataSource: {},
        state: _context?.state,
        needSuccessToast: false,
        _context,
      })
        .then((res) => {
          return res?.data;
        })
        .catch(() => {
          return undefined;
        });
    }
  };

  useEffect(() => {
    async function fetchData() {
      const tempData = await calculateData();
      if (tempData) {
        setData(tempData);
      } else if (isDesign && designMockData) {
        setData(designMockData);
      }
    }

    fetchData();
  }, []);

  useEffect(() => {
    if (isDesign) {
      if (dataFrom?.dataOrigin === dataOriginStatic) {
        const p = calculateData();
        p.then((res) => {
          if (res) {
            setData(res);
          } else if (isDesign && designMockData) {
            setData(designMockData);
          }
        });
      }
    }
  }, [dataFrom?.dataSource]);

  return {
    data,
    setData,
    calculateData,
  };
}
