import React, { useState } from 'react';
import './App.css';
import './PublishPage.css';

const PublishPage = () => {
  const [formData, setFormData] = useState({
    type: '',
    torrentFile: '',
    title: '',
    subtitle: ''
  });

  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();
    // 假设userid和tag可以从表单或用户信息中获取，这里用示例数据
    const userid = '123456';
    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', tag);
    data.append('file', formData.torrentFile);

    try {
      const response = await fetch('http://192.168.5.9:8080/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={handleChange} 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>

        <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;