import { useState } from 'react'
import { Button, Flex, Modal, Select, Form, Input, Popover, Card } from 'antd'
import { QuestionCircleOutlined } from '@ant-design/icons'
import AppProgressSteps from '@/components/AppProgressSteps'
import { useDataFieldQuery } from '@/hooks/useQuery'
import { useAI } from '@/hooks/useAI'
import MarkdownRender from '@/components/MarkdownRender'

export default function ButtonModal() {
  const { fieldOptions } = useDataFieldQuery()

  const [open, setOpen] = useState(false)
  const [current, setCurrent] = useState(0)
  const [form] = Form.useForm()

  const { post, isLoading } = useAI()

  // AI设置
  const handleAISet = () => {
    const values = form.getFieldsValue()
    post(
      {
        response_format: { type: 'json_object' },
        messages: [
          {
            role: 'user',
            content: `根据提供的数据集，设计一个随机森林算法，返回JSON格式。
          自变量：${values.independent_variables.join(', ')}
          因变量：${values.dependent_variable}
          分别返回是否拟合截距项（fit_intercept）:true/false、是否复制数据（copy_x）:true/false、并行计算核心数（n_jobs）:None（单线程）或 ≥1 的整数（如 -1 表示使用所有核心）、强制正系数（positive）:true/false的值。
返回格式示例：
json
        {
          "results": { "fit_intercept": true, "copy_x": true, "n_jobs": 1, "positive": false}
        }
          `,
          },
        ],
      },
      {
        onComplete: (message) => {
          console.log(message)
          try {
            const parse = JSON.parse(message.content)
            form.setFieldsValue(parse.results)
          } catch (error) {
            console.error(error)
          }
        },
      }
    )
  }

  // AI计算
  const [results, setResults] = useState<any>({})
  const code = `${results.code?.replace(/\\n/gi, '\n')}`
  const [openResults, setOpenResults] = useState(false)
  const handleAICompute = () => {
    const values = form.getFieldsValue()
    post(
      {
        response_format: { type: 'json_object' },
        messages: [
          {
            role: 'user',
            content: `根据提供的数据集，设置的随机森林算法进行试算检查，返回JSON格式。
          自变量：${values.independent_variables.join(', ')}
          因变量：${values.dependent_variable}
          是否拟合截距项（fit_intercept）：${values.fit_intercept}
          是否复制数据（copy_X）：${values.copy_x}
          并行计算核心数（n_jobs）：${values.n_jobs}
          强制正系数（positive）：${values.positive}
          返回格式示例：
          json
          {
           results: { pass: 'true或者false，代表通过不通过', code: "Python运行的代码，markdown能解析的代码", result: "计算结果" },
          }
           `,
          },
        ],
      },
      {
        onComplete: (message) => {
          console.log(message)
          try {
            const parse = JSON.parse(message.content)
            setResults(parse.results)
          } catch (error) {
            console.error(error)
          }
          if (current === 1) {
            setStep(3)
          }
        },
      }
    )
  }

  const [step, setStep] = useState<number>(-1)

  // 处理下一步按钮逻辑
  const handleNext = async () => {
    await form.validateFields()
    setCurrent(current + 1)
    setStep(-1)
  }

  // 开始处理
  const handleStart = () => {
    setStep(1)
    handleAICompute()
  }

  // 关闭并重置
  const handleClose = () => {
    setOpen(false)
    setCurrent(0)
    setStep(-1)
  }

  const steps = [
    {
      title: '设置算法',
      content: (
        <>
          <Form.Item label="请选择特征列" name="independent_variables" rules={[{ required: true, message: '请选择' }]}>
            <Select options={fieldOptions} placeholder="请选择" mode="multiple" />
          </Form.Item>
          <Form.Item label="请选择目标列" name="dependent_variable" rules={[{ required: true, message: '请选择' }]}>
            <Select options={fieldOptions} placeholder="请选择" />
          </Form.Item>
          <Flex gap={20}>
            <div style={{ flex: 1 }}>
              <Form.Item label="请输入树的数量（n_estimators）">
                <Flex gap={10}>
                  <Form.Item name="n_estimators" noStyle rules={[{ required: true, message: '请选择' }]}>
                    <Input placeholder="请输入" />
                  </Form.Item>
                  <Popover
                    title="树的数量（n_estimators）"
                    content={
                      <>
                        控制森林中决策树的数量（树越多，模型越稳定，但计算成本越高）
                        <br />
                        取值范围：≥1 的整数
                        <br />
                        参数越低意味着树少（模型简单，训练快，可能欠拟合），参数越高意味着树多（模型更精确，计算成本高，可能过拟合）
                      </>
                    }>
                    <QuestionCircleOutlined />
                  </Popover>
                </Flex>
              </Form.Item>
              <Form.Item label="请输入树的最大深度（max_depth）">
                <Flex gap={10}>
                  <Form.Item name="max_depth" noStyle rules={[{ required: true, message: '请选择' }]}>
                    <Input placeholder="请输入" />
                  </Form.Item>
                  <Popover
                    title="树的最大深度（max_depth）"
                    content={
                      <>
                        限制决策树的最大深度（防止过拟合，控制模型复杂度）
                        <br />
                        取值范围：≥1 的整数 或 None
                        <br />
                        参数越低意味着树浅（模型简单，可能欠拟合），参数越高意味着树深（模型复杂，可能过拟合），None意味着不限制
                      </>
                    }>
                    <QuestionCircleOutlined />
                  </Popover>
                </Flex>
              </Form.Item>
              <Form.Item label="请输入节点分裂最小样本数（min_samples_split）">
                <Flex gap={10}>
                  <Form.Item name="min_samples_split" noStyle rules={[{ required: true, message: '请选择' }]}>
                    <Input placeholder="请输入" />
                  </Form.Item>
                  <Popover
                    title="节点分裂最小样本数（min_samples_split）"
                    content={
                      <>
                        定义节点分裂所需的最小样本数（防止过拟合） <br />
                        取值范围：≥2 的整数 或 (0.0, 1.0] 的浮点数（表示样本比例） <br />
                        参数越低意味着分裂限制少（树更复杂，过拟合风险高），参数越高意味着分裂限制多（树更简单，可能欠拟合）
                      </>
                    }>
                    <QuestionCircleOutlined />
                  </Popover>
                </Flex>
              </Form.Item>
              <Form.Item label="请输入最大特征数（max_features）">
                <Flex gap={10}>
                  <Form.Item name="max_features" noStyle rules={[{ required: true, message: '请选择' }]}>
                    <Input placeholder="请输入" />
                  </Form.Item>
                  <Popover
                    title="最大特征数（max_features）"
                    content={
                      <>
                        分裂时考虑的最大特征数（控制特征随机性，提升泛化性） <br />
                        取值范围： <br />
                        整数（固定数量） <br />
                        浮点数（比例） <br />
                        'sqrt'（平方根） <br />
                        'log2'（对数）
                      </>
                    }>
                    <QuestionCircleOutlined />
                  </Popover>
                </Flex>
              </Form.Item>
              <Form.Item label="请输入有放回抽样（bootstrap）">
                <Flex gap={10}>
                  <Form.Item name="bootstrap" noStyle rules={[{ required: true, message: '请选择' }]}>
                    <Input placeholder="请输入" />
                  </Form.Item>
                  <Popover
                    title="有放回抽样（bootstrap）"
                    content={
                      <>
                        是否对样本进行有放回抽样（True=Bagging，False=用全部样本）
                        <br />
                        取值范围：
                        <br />
                        True（样本随机性增强，支持OOB评估，提升泛化性）
                        <br />
                        False（所有树用相同样本，降低多样性）
                      </>
                    }>
                    <QuestionCircleOutlined />
                  </Popover>
                </Flex>
              </Form.Item>
            </div>
            <Button type="primary" style={{ height: '250px' }} onClick={handleAISet} loading={isLoading}>
              AI设置
            </Button>
          </Flex>
        </>
      ),
    },
    {
      title: '随机森林处理',
      content: (
        <>
          <Flex vertical align="center" style={{ marginTop: '20px' }}>
            <Button type="primary" onClick={handleStart} loading={isLoading}>
              开始处理
            </Button>
            <AppProgressSteps current={step} items={[{ title: '启动' }, { title: '计算' }, { title: '计算结束' }]} />
          </Flex>
        </>
      ),
    },
  ]

  const Footer = () => {
    return (
      <Flex justify="center" gap={20}>
        {current === 0 && (
          <Button
            type="primary"
            onClick={() => {
              setOpenResults(true)
              handleAICompute()
            }}
            loading={isLoading}>
            AI检查试算
          </Button>
        )}
        {current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
        {current < steps.length - 1 && (
          <Button type="primary" onClick={handleNext}>
            下一步
          </Button>
        )}
        {current === steps.length - 1 && (
          <Button type="primary" onClick={handleClose} disabled={isLoading}>
            关闭
          </Button>
        )}
      </Flex>
    )
  }

  return (
    <>
      <Button type="primary" onClick={() => setOpen(true)}>
        随机森林
      </Button>
      <Modal
        title={steps[current].title}
        open={open}
        footer={<Footer />}
        destroyOnClose
        width={800}
        onCancel={handleClose}>
        <div style={{ minHeight: 300, padding: '20px 0' }}>
          <Form form={form} preserve={false}>
            {steps.map((item, index) => (
              <div key={index} hidden={current !== index} style={{ marginTop: '20px' }}>
                {item.content}
              </div>
            ))}
          </Form>
          {current === 2 && step >= 3 && (
            <Card style={{ marginTop: '20px' }}>
              <p>计算结束！</p>
              <p>计算结果如下：</p>
              {results.result}
            </Card>
          )}
        </div>
      </Modal>
      <Modal
        title="算法试算检查"
        open={openResults}
        footer={null}
        width={800}
        loading={isLoading}
        onCancel={() => setOpenResults(false)}>
        <p style={{ fontSize: 20, textAlign: 'center' }}>试算检查结果：{results.pass ? '通过' : '不通过'}！</p>
        <MarkdownRender>{code}</MarkdownRender>
      </Modal>
    </>
  )
}
