import instance from '@/utils/axios';
import React, { useCallback, useEffect, useState } from 'react';
import styles from './upload.module.css';
import {postTorrentUpload } from '@/api/torrent';
import { useLocation, useNavigate } from 'react-router-dom'; // 用于跳转
import { getTagsByMainTag } from '@/utils/common';
import { Checkbox, Row, Col } from 'antd'; // 使用 antd 的 Checkbox 组件
import { MainTag } from '@/types/common';
import { Select } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
import type { UploadProps } from 'antd';
import { Button, message, Upload as UploadArea } from 'antd';


const CreatePost = () => {
  const location = useLocation();
  const [postTitle, setPostTitle] = useState('');
  const [postContent, setPostContent] = useState('');
  const [isChecked, setIsChecked] = useState(false);
  const {type} = location.state || {type: ''}; // 获取路由传递的参数
  const [tagIds, setTagIds] = useState<number[]>([]);
  const [postType, setPostType] = useState<string>(type || ''); // 初始化 postType
  const navigate = useNavigate();
  const [tags, setTags] = useState<Map<string, number>>(new Map());

  const props: UploadProps = {
    name: 'file',
    action: process.env.REACT_APP_BASE_URL + postTorrentUpload, // 替换为实际的上传接口地址
    headers: {
      authorization: 'authorization-text',
    },
    onChange(info) {
      if (info.file.status !== 'uploading') {
        console.log(info.file, info.fileList);
      }
      if (info.file.status === 'done') {
        message.success(`${info.file.name} file uploaded successfully`);
      } else if (info.file.status === 'error') {
        message.error(`${info.file.name} file upload failed.`);
      }
    },
  };


  const handleSubmit = async () => {
    if (!postTitle.trim() || !postType || !postContent.trim()) {
      alert('请填写完整内容（资源名、类型、内容介绍）');
      return;
    }

    if (!isChecked) {
      alert('请先确认您已知晓以上内容');
      return;
    }

    const payload = {
      post: {
        postId: 0,
        userId: 0,
        postTitle,
        postContent,
        createdAt: Date.now(),
        postType,
        viewCount: 0,
        hotScore: 5,
        lastCalculated: Date.now()
      },
      tagIds: [0]
    };

    try {
      const res = await instance.post(Upload, payload);

      console.log('后端返回内容：', res.code);

      // 判断返回内容是否成功（根据你 mock 接口返回的 code 字段）
      if (res.code !== 0) throw new Error('发布失败');

      alert('发布成功！');
      navigate(-1); // 返回上一页（homepage）
    } catch (error) {
      alert('发布失败，请稍后重试');
      console.error(error);
    }
  };

  useEffect(() => {
    setTags(getTagsByMainTag(type)); // 获取对应类型的标签
  },[]);

  const handlePostTypeChange = useCallback((value:string) => {
    setPostType(value);
    setTags(getTagsByMainTag(value)); // 更新 tags
    setTagIds([]); // 清空已选的标签 ID
  }, [postType, setTags, setTagIds]);


  return (
    <div className={styles.container}>
      <div className={styles.formGroup}>
        <label>资源名：</label>
        <input
          type="text"
          value={postTitle}
          placeholder="请输入文本"
          onChange={(e) => setPostTitle(e.target.value)}
          className={styles.input}
        />
      </div>
  
      <div className={styles.formGroup}>
        <label>种子类型：</label>
        <Select
          value={postType}
          onChange={handlePostTypeChange}

          options ={ MainTag.map((item) => ({
            label: item,
            value: item
          }))} />
      </div>

      <div className={styles.formGroup}>
        <label>类型选择：</label>
        <Checkbox.Group
          value={tagIds}
          onChange={(checkedValues) => setTagIds(checkedValues as number[])}
        >
          <Row gutter={[12, 12]}>
            {[...tags.entries()].map(([name, id]) => (
              <Col key={id} xs={12} sm={8} md={6} lg={4}>
                <Checkbox value={id}>{name}</Checkbox>
              </Col>
            ))}
          </Row>
        </Checkbox.Group>
      </div>

      {/* 暂时移除上传文件表单 */}
      <div className={styles.formGroup}>
        <label>上传资源：</label>
        <UploadArea {...props}>
          <Button icon={<UploadOutlined />}>Upload</Button>
        </UploadArea>
      </div>

      <div className={styles.formGroup}>
        <label>内容介绍：</label>
        <textarea
          placeholder="请输入内容介绍"
          value={postContent}
          onChange={(e) => setPostContent(e.target.value)}
          maxLength={200}
          className={styles.textarea}
        />
        <div className={styles.charCount}>{postContent.length}/200</div>
      </div>

      <div className={styles.requirement}>【发布内容要求】</div>

      <div className={styles.checkbox}>
        <input
          type="checkbox"
          checked={isChecked}
          onChange={() => setIsChecked(!isChecked)}
        />
        <span>我已知晓以上内容</span>
      </div>

      <button onClick={handleSubmit} className={styles.submitBtn} disabled={!isChecked}>
        我已知晓
      </button>
    </div>
  );
};

export default CreatePost;
