// 修改弹窗
import React, { useRef, useEffect, useState } from 'react';
import { createForm, onFieldReact, FormPathPattern, Field } from '@formily/core';
import { getCoinTypeList } from '@/services/recharge/coinType';
import { FormProvider, createSchemaField } from '@formily/react';
import Modal, { ModalProps } from '@/components/Modal';
import { Form, FormItem, Input, Select } from '@formily/antd';
import { action } from '@formily/reactive';

interface EditWalletModalPropsType extends ModalProps {
  editModalData: any;
  onOk: (val: any) => void;
  onCancel: () => void;
}

const SchemaField = createSchemaField({
  components: {
    FormItem,
    Input,
    Select,
  },
});

const EditWalletModal = ({ onOk, onCancel, editModalData, ...rest }: EditWalletModalPropsType) => {
  const [coinTypeData, setCoinTypeData] = useState({});

  const getSelectData = async () => {
    const list = await getCoinTypeList({ page: 1, size: 10 });
    setCoinTypeData(list);
  };

  const useAsyncDataSource = (
    pattern: FormPathPattern,
    service: (field: Field) => Promise<{ label: string; value: any }[]>,
  ) => {
    onFieldReact(pattern, (field) => {
      service(field).then(
        action.bound((data) => {
          field.dataSource = data;
        }),
      );
    });
  };

  const form = createForm({
    effects: () => {
      // eslint-disable-next-line react-hooks/rules-of-hooks
      useAsyncDataSource('name', async (field) => {
        getSelectData();
        const list = coinTypeData;
        const option = [];
        for (let index = 0; index < list.items.length; index++) {
          const element = list.items[index];
          const item = {
            label: element.name,
            value: element.name,
          };
          option.push(item);
        }
        return option;
      });
    },
  });

  useEffect(() => {
    form.setInitialValues(editModalData);
  });

  const handleOk = () => {
    form.submit(async () => {
      const formState = form.getFormState();
      onOk(formState.values);
    });
  };

  const handleCancel = () => {
    onCancel();
  };

  return (
    <Modal title="修改收款地址" onOk={handleOk} onCancel={handleCancel} width={800} {...rest}>
      <Form form={form} labelCol={4} wrapperCol={18}>
        <SchemaField>
          <SchemaField.String
            name="address"
            title="旧收款地址"
            x-disabled
            x-decorator="FormItem"
            x-component="Input"
          />
          <SchemaField.String
            name="name"
            title="游戏币名称"
            required
            x-decorator="FormItem"
            x-component="Select"
          />
          <SchemaField.String
            name="new_address"
            title="新收款地址"
            required
            x-decorator="FormItem"
            x-component="Input"
          />
        </SchemaField>
      </Form>
    </Modal>
  );
};

export default EditWalletModal;
