import React, { useState } from 'react';
import axios from 'axios';
import Header from '../../components/Header'; // 导入 Header 组件
import './PublishSeed.css'

const API_BASE = process.env.REACT_APP_API_BASE;

const PublishSeed = () => {
  const [title, setTitle] = useState('');
  const [description, setDescription] = useState('');
  const [tags, setTags] = useState([]);
  const [category, setCategory] = useState('movie');
  const [file, setFile] = useState(null);
  const [imageUrl, setImageUrl] = useState('');
  const [message, setMessage] = useState('');
  const [isLoading, setIsLoading] = useState(false);

  const handleTagsChange = (e) => {
    setTags(e.target.value.split(',').map(tag => tag.trim()));
  };

  const handleFileChange = (e) => {
    setFile(e.target.files[0]);
  };

  const handleSubmit = async (e) => {
    e.preventDefault();
    setIsLoading(true);
    setMessage('');

    const formData = new FormData();
    formData.append('title', title);
    formData.append('description', description);
    formData.append('tags', JSON.stringify(tags)); // Tags as JSON array
    formData.append('category', category);
    formData.append('file', file);
    formData.append('image_url', imageUrl);

    try {
      const response = await axios.post(`${API_BASE}/echo/seeds/upload`, formData, {
        headers: {
          'Content-Type': 'multipart/form-data',
        },
      });

      if (response.data.status === 'success') {
        setMessage('种子上传成功');
      } else {
        setMessage('上传失败，请稍后再试');
      }
    } catch (error) {
      console.error(error);
      setMessage('上传失败，发生了错误');
    } finally {
      setIsLoading(false);
    }
  };

  return (
    <div className="publish-seed-container">
      <Header /> {/* 在这里插入导航栏 */}
      <div className="pub-card">
      {message && <div className="message">{message}</div>}
      <form onSubmit={handleSubmit} encType="multipart/form-data">
        <div className="title-tag">
          <label>标题</label>
          <input
            type="text"
            value={title}
            onChange={(e) => setTitle(e.target.value)}
            required
          />
        </div>

        <div className="discription">
          <label>描述</label>
          <textarea
            value={description}
            onChange={(e) => setDescription(e.target.value)}
            required
          />
        </div>

        <div className="title-tag">
          <label>标签 (逗号分隔)</label>
          <input
            type="text"
            value={tags.join(', ')}
            onChange={handleTagsChange}
            placeholder="例如：科幻, 动作"
            required
          />
        </div>

        <div className="pub-categoty">
          <label>分类</label>
          <select
            value={category}
            onChange={(e) => setCategory(e.target.value)}
            required
          >
            <option value="movie">电影</option>
            <option value="tv">电视剧</option>
            <option value="music">音乐</option>
          </select>
        </div>

        <div className="seed-file">
          <label>种子文件</label>
          <label className="seed-file-label">
              点击选择文件
              <input
                type="file"
                onChange={handleFileChange}
                style={{ display: 'none' }}
              />
          </label>
        </div>

        <div className="form-group">
          <label>封面图URL</label>
          <input
            type="url"
            value={imageUrl}
            onChange={(e) => setImageUrl(e.target.value)}
            placeholder="例如：http://example.com/images/cover.jpg"
            required
            style={{ padding: '1%',
              width: '100%',
              borderRadius: '6px',
              border: '1px solid #e0c4a1',
              backgroundColor: '#fff5f5',
              color: '#5F4437',
              fontSize: '1rem',
              marginBottom: '2%'}}
          />
        </div>

        <div className="upload-button">
          <button type="submit" disabled={isLoading}>
            {isLoading ? '正在上传...' : '上传种子'}
          </button>
        </div>
      </form>
      </div>
    </div>
  );
};

export default PublishSeed;
