import React, { useState } from 'react';
import { useParams, useNavigate,useLocation } from 'react-router-dom';
import './RequestDetail.css';

const RequestDetail = () => {
  const { id } = useParams();
  const navigate = useNavigate();
  const location = useLocation();
  
  // 模拟数据
  const [post, setPost] = useState({
    id: 1,
    title: '求《药屋少女的呢喃》第二季全集',
    content: '求1080P带中文字幕版本，最好是内嵌字幕不是外挂的。\n\n希望有热心大佬能分享，可以给积分奖励！',
    author: '动漫爱好者',
    authorAvatar: 'https://via.placeholder.com/40',
    date: '2023-10-15',
    likeCount: 24,
    isLiked: false,
    isFavorited: false
  });

  const [comments, setComments] = useState([
    {
      id: 1,
      type: 'text',
      author: '资源达人',
      authorAvatar: 'https://via.placeholder.com/40',
      content: '我有第1-5集，需要的话可以私聊',
      date: '2023-10-15 14:30',
      likeCount: 5
    },
    {
      id: 2,
      type: 'torrent',
      title: '药屋少女的呢喃第二季第8集',
      size: '1.2GB',
      author: '种子分享者',
      authorAvatar: 'https://via.placeholder.com/40',
      date: '2023-10-16 09:15',
      likeCount: 8
    }
  ]);

  const [newComment, setNewComment] = useState('');

  const handleLikePost = () => {
    setPost(prev => ({
      ...prev,
      likeCount: prev.isLiked ? prev.likeCount - 1 : prev.likeCount + 1,
      isLiked: !prev.isLiked
    }));
  };

  const handleFavoritePost = () => {
    setPost(prev => ({
      ...prev,
      isFavorited: !prev.isFavorited
    }));
  };

  const handleCommentSubmit = (e) => {
    e.preventDefault();
    if (!newComment.trim()) return;
    
    const newCommentObj = {
      id: comments.length + 1,
      type: 'text',
      author: '当前用户',
      authorAvatar: 'https://via.placeholder.com/40',
      content: newComment,
      date: new Date().toLocaleString(),
      likeCount: 0
    };
    
    setComments([...comments, newCommentObj]);
    setNewComment('');
  };

  const handleDownloadTorrent = (commentId) => {


    
    console.log('下载种子', commentId);
    // 实际下载逻辑
  };

  const handleBack = () => {
    const fromTab = location.state?.fromTab; // 从跳转时传递的 state 中获取
    if (fromTab) {
      navigate(`/dashboard/${fromTab}`); // 明确返回对应标签页
    } else {
      navigate(-1); // 保底策略
    }
  }

  return (
    <div className="request-detail-container">
      <button className="back-button" onClick={handleBack}>
        &larr; 返回求种区
      </button>
      
      <div className="request-post">
        <div className="post-header">
          <img src={post.authorAvatar} alt={post.author} className="post-avatar" />
          <div className="post-meta">
            <div className="post-author">{post.author}</div>
            <div className="post-date">{post.date}</div>
          </div>
        </div>
        
        <h1 className="post-title">{post.title}</h1>
        
        <div className="post-content">
          {post.content.split('\n').map((para, i) => (
            <p key={i}>{para}</p>
          ))}
        </div>
        
        <div className="post-actions">
          <button 
            className={`like-button ${post.isLiked ? 'liked' : ''}`}
            onClick={handleLikePost}
          >
            👍 点赞 ({post.likeCount})
          </button>
          <button 
            className={`favorite-button ${post.isFavorited ? 'favorited' : ''}`}
            onClick={handleFavoritePost}
          >
            {post.isFavorited ? '★ 已收藏' : '☆ 收藏'}
          </button>
        </div>
      </div>
      
      <div className="comments-section">
        <h2>回应 ({comments.length})</h2>
        
        <form onSubmit={handleCommentSubmit} className="comment-form">
          <textarea
            value={newComment}
            onChange={(e) => setNewComment(e.target.value)}
            placeholder="写下你的回应..."
            rows="3"
            required
          />
          <div className="form-actions">
            <button type="submit" className="submit-comment">发表文字回应</button>
            <button 
              type="button" 
              className="submit-torrent"
              onClick={() => console.log('打开种子上传对话框')}
            >
              上传种子回应
            </button>
          </div>
        </form>
        
        <div className="comment-list">
          {comments.map(comment => (
            <div key={comment.id} className={`comment-item ${comment.type}`}>
              <img 
                src={comment.authorAvatar} 
                alt={comment.author} 
                className="comment-avatar"
              />
              
              <div className="comment-content">
                <div className="comment-header">
                  <span className="comment-author">{comment.author}</span>
                  <span className="comment-date">{comment.date}</span>
                </div>
                
                {comment.type === 'text' ? (
                  <p className="comment-text">{comment.content}</p>
                ) : (
                  <div className="torrent-comment">
                    <span className="torrent-title">{comment.title}</span>
                    <span className="torrent-size">{comment.size}</span>
                    <button 
                      className="download-torrent"
                      onClick={() => handleDownloadTorrent(comment.id)}
                    >
                      立即下载
                    </button>
                  </div>
                )}
                
                <button className="comment-like">
                  👍 ({comment.likeCount})
                </button>
              </div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
};

export default RequestDetail;