import React, { useEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import { NodeEditorProps } from './index';
import { Form, Input, Select, Typography } from '@arco-design/web-react';
import { IconUnorderedList } from '@arco-design/web-react/icon';
import ParamsTable from '@/components/FlowEditor/nodeEditors/components/ParamsTable';
import { queryInstance } from '@/api/components';

const BasicNodeEditor: React.FC<NodeEditorProps> = ({
                                                      node,
                                                      nodeData,
                                                      updateNodeData
                                                    }) => {
  const [currentCompInfo, setCurrentCompInfo] = useState(null);
  const [options, setOptions] = useState([]);
  const { projectComponentData, info, currentAppData } = useSelector(state => state.ideContainer);

  const getCurrentProjectStoreData = () => {
    const compData = projectComponentData[currentAppData.sceneId] || {};

    const result: any[] = [];

    // 处理projectCompDto中的数据
    if (compData.projectCompDto) {
      const { mineComp = [], pubComp = [], teamWorkComp = [] } = compData.projectCompDto;

      // 添加mineComp数据
      mineComp.forEach((item: any) => {
        result.push({
          ...item,
          type: 'mineComp'
        });
      });

      // 添加pubComp数据
      pubComp.forEach((item: any) => {
        result.push({
          ...item,
          type: 'pubComp'
        });
      });

      // 添加teamWorkComp数据
      teamWorkComp.forEach((item: any) => {
        result.push({
          ...item,
          type: 'teamWorkComp'
        });
      });
    }

    // 处理projectFlowDto中的数据
    if (compData.projectFlowDto) {
      const { mineFlow = [], pubFlow = [] } = compData.projectFlowDto;

      // 添加mineFlow数据
      mineFlow.forEach((item: any) => {
        result.push({
          ...item,
          type: 'mineFlow'
        });
      });

      // 添加pubFlow数据
      pubFlow.forEach((item: any) => {
        result.push({
          ...item,
          type: 'pubFlow'
        });
      });
    }

    return result;
  };

  const getCompInfo = () => {
    const flatData = getCurrentProjectStoreData();
    setCurrentCompInfo(flatData.find((item: any) => item.id === nodeData.compId));
  };
  const getCompInstance = async () => {
    const res: any = await queryInstance(nodeData.compId);
    if (res.code === 200) {
      const newOptions = res.data.map((item: any) => {
        return {
          label: item.identifier,
          value: item.identifier
        };
      });
      setOptions(newOptions);
    }
  };
  useEffect(() => {
    getCompInfo();
    getCompInstance();
  }, []);
  return (
    <Form layout="vertical">
      <Form.Item label="节点标题">
        <Input
          value={nodeData.title || ''}
          onChange={(value) => updateNodeData('title', value)}
        />
      </Form.Item>
      <Form.Item label="描述">
        <Input.TextArea
          value={nodeData.description || ''}
          onChange={(value) => updateNodeData('description', value)}
        />
      </Form.Item>
      <Typography.Title heading={5}><IconUnorderedList style={{ marginRight: 5 }} />组件信息</Typography.Title>
      <div style={{ display: 'flex', marginTop: 10, marginBottom: 10 }}>
        <span>组件类型：</span>
        <div>{currentCompInfo?.type}</div>
      </div>
      <div style={{ display: 'flex', marginTop: 10, marginBottom: 10 }}>
        <span>组件名称：</span>
        <div>{currentCompInfo?.name}</div>
      </div>
      <div style={{ display: 'flex', marginTop: 10, marginBottom: 10 }}>
        <span>组件描述：</span>
        <div>{currentCompInfo?.description}</div>
      </div>
      <Form.Item label="节点类型">
        <Select
          value={nodeData?.component?.compIdentifier || ''}
          onChange={(value) => {
            console.log(value);
            updateNodeData('component', {
              ...nodeData.component,
              compIdentifier: value,
              compInstanceIdentifier: value
            });
          }}
          options={options}
        />
      </Form.Item>
      <Typography.Title heading={5}><IconUnorderedList style={{ marginRight: 5 }} />输入参数</Typography.Title>
      <ParamsTable
        initialData={nodeData.parameters.dataIns || []}
        onUpdateData={(data) => {
          updateNodeData('parameters', {
            ...nodeData.parameters,
            dataIns: data
          });
        }}
      />
      <Typography.Title heading={5}><IconUnorderedList style={{ marginRight: 5 }} />输出参数</Typography.Title>
      <ParamsTable
        initialData={nodeData.parameters.dataOuts || []}
        onUpdateData={(data) => {
          updateNodeData('parameters', {
            ...nodeData.parameters,
            dataOuts: data
          });
        }}
      />
    </Form>
  );
};

export default BasicNodeEditor;