import React, { useState } from 'react';
import './App.css';
import './PublishPage.css';
import { API_BASE_URL } from "./config";

const PublishPage = () => {
  const [formData, setFormData] = useState({
    type: '',
    torrentFile: '',
    title: '',
    subtitle: ''
  });
  const [subType, setSubType] = useState('');

  const typeOptions = {
    '电影': ['大陆', '港台', '欧美', '日韩'],
    '剧集': ['国产电视剧', '港剧', '欧美剧', '日韩剧'],
    '音乐': ['古典音乐', '流行音乐', '摇滚', '电子音乐', '说唱'],
    '动漫': ['国创', '日漫', '欧美动漫', '韩漫'],
    '游戏': ['PC', '主机', '移动', '掌机', '视频'],
    '体育': ['篮球', '足球', '羽毛球', '排球', '电竞'],
    '资料': ['出版物', '学习教程', '素材模板', '演讲交流', '日常娱乐'],
  };

  const handleChange = (e) => {
    const { name, value } = e.target;
    setFormData({ ...formData, [name]: value });
  };

  const handleFileChange = (e) => {
    const file = e.target.files[0];
    if (file && file.name.split('.').pop() !== 'torrent') {
      alert('仅能上传.torrent类型文件');
      e.target.value = null; // Clear the input
    } else {
      setFormData({ ...formData, torrentFile: file });
    }
  };

  const handleSubmit = async (e) => {
    e.preventDefault();

    console.log('Form Data Submitted:', formData);

    // 假设userid和tag可以从表单或用户信息中获取，这里用示例数据
    const userid = '550e8400-e29b-41d4-a716-446655440000';
    const tag = formData.type ? formData.type : '高清';
    if (!formData.torrentFile) {
      alert('请上传.torrent文件');
      return;
    }
    const data = new FormData();
    data.append('userid', userid);
    data.append('title', formData.title);
    data.append('tag', subType);
    data.append('file', formData.torrentFile);
    data.append('subtitle', formData.subtitle);
    // data.append('subtype', subType);
    // console.log(data.get('tag'));

    try {

      const response = await fetch('http://192.168.5.9:8080/api/save-torrent', {

      // console.log(data.get('userid'));
      // console.log(data.get('title'));
      const response = await fetch(`${API_BASE_URL}/api/save-torrent`, {

      // console.log(data.get('userid'));
      // console.log(data.get('title'));
      const response = await fetch(`${API_BASE_URL}/api/save-torrent`, {

        method: 'POST',
        body: data,
      });
      if (response.ok) {
        alert('上传成功！');
      } else {
        alert('上传失败');
      }
    } catch (err) {
      alert('网络错误');
    }

  };

  return (
    <div className="publish-page">
      <h1 className="page-title">发布种子</h1>
      <form onSubmit={handleSubmit} className="publish-form">
        <div className="form-row">
          <label htmlFor="type">类型</label>
          <select name="type" id="type" value={formData.type} onChange={e => { handleChange(e); setSubType(''); }} required>
            <option value="">请选择类型</option>
            <option value="电影">电影</option>
            <option value="剧集">剧集</option>
            <option value="音乐">音乐</option>
            <option value="动漫">动漫</option>
            <option value="游戏">游戏</option>
            <option value="体育">体育</option>
            <option value="资料">资料</option>
          </select>
        </div>
        {formData.type && typeOptions[formData.type] && (
          <div className="form-row">
            <label htmlFor="subtype">具体类型</label>
            <select name="subtype" id="subtype" value={subType} onChange={e => setSubType(e.target.value)} required>
              <option value="">请选择具体类型</option>
              {typeOptions[formData.type].map(opt => (
                <option key={opt} value={opt}>{opt}</option>
              ))}
            </select>
          </div>
        )}

        <div className="form-row">
          <label htmlFor="torrentFile">种子文件</label>
          <input
            type="file"
            id="torrentFile"
            name="torrentFile"
            onChange={handleFileChange}
            required
          />
          <span style={{ fontSize: '12px', color: '#666' }}>需上传.torrent类型文件</span>
        </div>

        <div className="form-row">
          <label htmlFor="title">标题</label>
          <input
            type="text"
            id="title"
            name="title"
            value={formData.title}
            onChange={handleChange}
            required
          />
        </div>

        <div className="form-row">
          <label htmlFor="subtitle">种子简介</label>
          <input
            type="text"
            id="subtitle"
            name="subtitle"
            value={formData.subtitle}
            onChange={handleChange}
          />
        </div>

        <div className="form-row submit-row">
          <button type="submit" className="submit-button">提交</button>
        </div>
      </form>
    </div>
  );
};

export default PublishPage;