import CodeSelect from '@/components/CodeSelect';
import ParameterSelect from '@/components/ParameterSelect';
import ResourceSelect, {
  requiredValidator,
  ResourceSelectorType,
} from '@/components/ResourceSelect';
import SubAreaTitle from '@/components/SubAreaTitle';
import { AutoMLTaskType, autoMLTaskTypeOptions } from '@/enums';
import { Col, Form, Input, InputNumber, Radio, Row, Select, Switch } from 'antd';
import {
  classifierAlgorithms,
  FrameworkType,
  frameworkTypeOptions,
  queryStrategies,
  regressorAlgorithms,
} from './utils';

function ExecuteConfig() {
  const form = Form.useFormInstance();
  return (
    <>
      <SubAreaTitle
        title="配置信息"
        image={require('@/assets/img/model-deployment.png')}
        style={{ marginTop: '20px', marginBottom: '24px' }}
      ></SubAreaTitle>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="任务类型"
            name="task_type"
            rules={[{ required: true, message: '请选择任务类型' }]}
          >
            <Radio.Group
              options={autoMLTaskTypeOptions}
              onChange={() => form.resetFields(['metrics'])}
            ></Radio.Group>
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="代码配置"
            name="code_config"
            rules={[
              {
                validator: requiredValidator,
                message: '请选择代码配置',
              },
            ]}
            required
          >
            <CodeSelect placeholder="请选择代码配置" canInput={false} size="large" />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="数据集"
            name="dataset"
            rules={[
              {
                validator: requiredValidator,
                message: '请选择数据集',
              },
            ]}
            required
          >
            <ResourceSelect
              type={ResourceSelectorType.Dataset}
              placeholder="请选择数据集"
              canInput={false}
              size="large"
            />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="数据集处理文件路径"
            name="dataset_py"
            rules={[
              {
                required: true,
                message: '请输入数据集处理文件路径',
              },
            ]}
          >
            <Input placeholder="请输入数据集处理文件路径" maxLength={64} showCount allowClear />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="数据集类名"
            name="dataset_class_name"
            rules={[
              {
                required: true,
                message: '请输入数据集类名',
              },
            ]}
          >
            <Input placeholder="请输入数据集类名" maxLength={64} showCount allowClear />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="镜像"
            name="image"
            rules={[
              {
                validator: requiredValidator,
                message: '请选择镜像',
              },
            ]}
            required
          >
            <ResourceSelect
              type={ResourceSelectorType.Mirror}
              placeholder="请选择镜像"
              canInput={false}
            />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="资源规格"
            name="computing_resource_id"
            rules={[
              {
                required: true,
                message: '请选择资源规格',
              },
            ]}
          >
            <ParameterSelect dataType="resource" placeholder="请选择资源规格" />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="框架类型"
            name="framework_type"
            rules={[
              {
                required: true,
                message: '请选择框架类型',
              },
            ]}
          >
            <Select
              placeholder="请选择框架类型"
              options={frameworkTypeOptions}
              showSearch
              allowClear
            />
          </Form.Item>
        </Col>
      </Row>

      <Form.Item dependencies={['task_type', 'framework_type']} noStyle>
        {({ getFieldValue }) => {
          const taskType = getFieldValue('task_type');
          const frameworkType = getFieldValue('framework_type');
          if (frameworkType === FrameworkType.Keras || frameworkType === FrameworkType.Pytorch) {
            return (
              <>
                <Row gutter={8}>
                  <Col span={10}>
                    <Form.Item label="预训练模型" name="model">
                      <ResourceSelect
                        type={ResourceSelectorType.Model}
                        placeholder="请选择模型"
                        canInput={false}
                        size="large"
                      />
                    </Form.Item>
                  </Col>
                </Row>
                <Row gutter={8}>
                  <Col span={10}>
                    <Form.Item
                      label="模型文件路径"
                      name="model_py"
                      rules={[
                        {
                          required: true,
                          message: '请输入模型文件路径',
                        },
                      ]}
                    >
                      <Input placeholder="请输入模型文件路径" maxLength={64} showCount allowClear />
                    </Form.Item>
                  </Col>
                </Row>
                <Row gutter={8}>
                  <Col span={10}>
                    <Form.Item
                      label="模型类名称"
                      name="model_class_name"
                      rules={[
                        {
                          required: true,
                          message: '请输入模型类名称',
                        },
                      ]}
                    >
                      <Input placeholder="请输入模型类名称" maxLength={64} showCount allowClear />
                    </Form.Item>
                  </Col>
                </Row>
                <Row gutter={8}>
                  <Col span={10}>
                    <Form.Item
                      label="batch_size"
                      name="batch_size"
                      rules={[
                        {
                          required: true,
                          message: '请输入 batch_size',
                        },
                      ]}
                    >
                      <InputNumber placeholder="请输入 batch_size" min={0} precision={0} />
                    </Form.Item>
                  </Col>
                </Row>
                <Row gutter={8}>
                  <Col span={10}>
                    <Form.Item
                      label="epochs"
                      name="epochs"
                      rules={[
                        {
                          required: true,
                          message: '请输入 epochs',
                        },
                      ]}
                    >
                      <InputNumber placeholder="请输入 epochs" min={0} precision={0} />
                    </Form.Item>
                  </Col>
                </Row>
                {frameworkType === FrameworkType.Pytorch ? (
                  <>
                    <Row gutter={8}>
                      <Col span={10}>
                        <Form.Item
                          label="学习率"
                          name="lr"
                          rules={[
                            {
                              required: true,
                              message: '请输入学习率',
                            },
                          ]}
                        >
                          <InputNumber placeholder="请输入学习率" min={0} />
                        </Form.Item>
                      </Col>
                    </Row>
                    <Row gutter={8}>
                      <Col span={10}>
                        <Form.Item
                          label="loss 文件路径"
                          name="loss_py"
                          rules={[
                            {
                              required: true,
                              message: '请输入 loss 文件路径',
                            },
                          ]}
                        >
                          <Input
                            placeholder="请输入 loss 文件路径"
                            maxLength={64}
                            showCount
                            allowClear
                          />
                        </Form.Item>
                      </Col>
                    </Row>
                    <Row gutter={8}>
                      <Col span={10}>
                        <Form.Item
                          label="loss 类名"
                          name="loss_class_name"
                          rules={[
                            {
                              required: true,
                              message: '请输入 loss 类名',
                            },
                          ]}
                        >
                          <Input
                            placeholder="请输入 loss 类名"
                            maxLength={64}
                            showCount
                            allowClear
                          />
                        </Form.Item>
                      </Col>
                    </Row>
                  </>
                ) : null}
              </>
            );
          } else if (frameworkType === FrameworkType.Sklearn) {
            if (taskType === AutoMLTaskType.Classification) {
              return (
                <>
                  <Row gutter={8}>
                    <Col span={10}>
                      <Form.Item
                        label="分类算法"
                        name="classifier_alg"
                        rules={[
                          {
                            required: true,
                            message: '请选择分类算法',
                          },
                        ]}
                      >
                        <Select
                          placeholder="请选择分类算法"
                          options={classifierAlgorithms}
                          showSearch
                          allowClear
                        />
                      </Form.Item>
                    </Col>
                  </Row>
                </>
              );
            } else {
              return (
                <>
                  <Row gutter={8}>
                    <Col span={10}>
                      <Form.Item
                        label="回归算法"
                        name="regressor_alg"
                        rules={[
                          {
                            required: true,
                            message: '请选择回归算法',
                          },
                        ]}
                      >
                        <Select
                          placeholder="请选择回归算法"
                          options={regressorAlgorithms}
                          showSearch
                          allowClear
                        />
                      </Form.Item>
                    </Col>
                  </Row>
                </>
              );
            }
          } else {
            return null;
          }
        }}
      </Form.Item>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item label="是否随机打乱" name="shuffle" valuePropName="checked">
            <Switch />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="数据量"
            name="data_size"
            rules={[
              {
                required: true,
                message: '请输入数据量',
              },
            ]}
          >
            <InputNumber placeholder="请输入数据量" min={0} precision={0} />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="训练集数据量"
            name="train_size"
            rules={[
              {
                required: true,
                message: '请输入训练集数据量',
              },
            ]}
          >
            <InputNumber placeholder="请输入训练集数据量" min={0} precision={0} />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="初始训练数据量"
            name="initial_num"
            rules={[
              {
                required: true,
                message: '请输入初始训练数据量',
              },
            ]}
          >
            <InputNumber placeholder="请输入初始训练数据量" min={0} precision={0} />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="查询次数"
            name="queries_num"
            rules={[
              {
                required: true,
                message: '请输入查询次数量',
              },
            ]}
          >
            <InputNumber placeholder="请输入查询次数" min={0} precision={0} />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="每次查询数据量"
            name="instances_num"
            rules={[
              {
                required: true,
                message: '请输入每次查询数据量',
              },
            ]}
          >
            <InputNumber placeholder="请输入每次查询数据量" min={0} precision={0} />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="查询策略"
            name="query_strategy"
            rules={[
              {
                required: true,
                message: '请选择查询策略',
              },
            ]}
          >
            <Select placeholder="请选择查询策略" options={queryStrategies} showSearch allowClear />
          </Form.Item>
        </Col>
      </Row>

      <Row gutter={8}>
        <Col span={10}>
          <Form.Item
            label="检查点轮数"
            name="checkpoint_num"
            rules={[
              {
                required: true,
                message: '请输入检查点轮数',
              },
            ]}
            tooltip="多少轮查询保存一次模型参数"
          >
            <InputNumber placeholder="请输入检查点轮数" min={0} precision={0} />
          </Form.Item>
        </Col>
      </Row>
    </>
  );
}

export default ExecuteConfig;
