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

const API_BASE = process.env.REACT_APP_API_BASE;

const InterestGroup = () => {
  const [groups, setGroups] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  const [category, setCategory] = useState('');
  const [name, setName] = useState('');
  const [page, setPage] = useState(1);
  const [size, setSize] = useState(10);
  const [totalPages, setTotalPages] = useState(1);
  const [sortBy, setSortBy] = useState('member_count'); // 默认按照成员数排序
  const [joinStatus, setJoinStatus] = useState({}); // 存储每个小组的加入状态

  useEffect(() => {
    // 请求兴趣小组列表
    const fetchGroups = async () => {
      try {
        setLoading(true);
        setError(null);
        const response = await axios.get(`${API_BASE}/echo/groups`, {
          params: {
            category,
            name,
            page,
            size,
            sort_by: sortBy
          }
        });

        if (response.data.status === 'success') {
          setGroups(response.data.items);
          setTotalPages(response.data.total_pages); // 更新总页数
        } else {
          setError('获取兴趣小组列表失败');
        }
      } catch (err) {
        setError('请求失败，请稍后再试');
      } finally {
        setLoading(false);
      }
    };

    fetchGroups();
  }, [category, name, page, size, sortBy]);

  const handleCategoryChange = (e) => {
    setCategory(e.target.value);
    setPage(1); // 重置为第一页
  };

  const handleSearchChange = (e) => {
    setName(e.target.value);
    setPage(1); // 重置为第一页
  };

  const handleSortChange = (e) => {
    setSortBy(e.target.value);
  };

  const handlePageChange = (newPage) => {
    if (newPage > 0 && newPage <= totalPages) {
      setPage(newPage);
    }
  };

  // 加入兴趣小组
  const handleJoinGroup = async (groupId) => {
    const userId = 1; // 假设用户ID为1，可以根据实际情况获取

    try {
      const response = await axios.post(`${API_BASE}/echo/groups/${groupId}/join`, {
        user_id: userId
      });

      if (response.data.status === 'success') {
        setJoinStatus(prevState => ({
          ...prevState,
          [groupId]: '加入成功'
        }));
      } else {
        setJoinStatus(prevState => ({
          ...prevState,
          [groupId]: '加入失败'
        }));
      }
    } catch (error) {
      setJoinStatus(prevState => ({
        ...prevState,
        [groupId]: '请求失败，请稍后再试'
      }));
    }
  };

  return (
    <div className="interest-group-container">
      {/* Header 组件放在页面最上方 */}
      <Header />

      <h1>兴趣小组列表</h1>
      {/* 分类筛选 */}
      <div className="filter">
        <label>分类：</label>
        <select onChange={handleCategoryChange} value={category}>
          <option value="">全部</option>
          <option value="影视">影视</option>
          <option value="游戏">游戏</option>
          <option value="学习">学习</option>
          <option value="体育">体育</option>
          <option value="其他">其他</option>
        </select>
      </div>

      {/* 搜索框 */}
      <div className="search">
        <label>搜索：</label>
        <input
          type="text"
          value={name}
          onChange={handleSearchChange}
          placeholder="输入小组名称搜索"
        />
      </div>

      {/* 排序 */}
      <div className="sort">
        <label>排序：</label>
        <select onChange={handleSortChange} value={sortBy}>
          <option value="member_count">按成员数排序</option>
          <option value="name">按名称排序</option>
          <option value="category">按分类排序</option>
        </select>
      </div>

      {/* 加载中提示 */}
      {loading && <p>加载中...</p>}

      {/* 错误提示 */}
      {error && <p className="error">{error}</p>}

      {/* 小组列表 */}
      {!loading && !error && (
        <div className="group-list">
          {groups.map((group) => (
            <div className="group-item" key={group.group_id}>
              <img
                src={group.cover_image}
                alt={group.name}
                className="group-cover"
              />
              <div className="group-info">
                <h2>{group.name}</h2>
                <p>{group.description}</p>
                <p>成员数：{group.member_count}</p>
                <p>分类：{group.category}</p>
                {/* 加入小组按钮 */}
                <button
                  onClick={() => handleJoinGroup(group.group_id)}
                  disabled={joinStatus[group.group_id] === '加入成功'}
                >
                  {joinStatus[group.group_id] === '加入成功' ? '已加入' : '加入小组'}
                </button>
                {/* 显示加入状态 */}
                {joinStatus[group.group_id] && <p>{joinStatus[group.group_id]}</p>}
              </div>
            </div>
          ))}
        </div>
      )}

      {/* 分页 */}
      <div className="pagination">
        <button onClick={() => handlePageChange(page - 1)} disabled={page <= 1}>
          上一页
        </button>
        <span>第 {page} 页 / 共 {totalPages} 页</span>
        <button
          onClick={() => handlePageChange(page + 1)}
          disabled={page >= totalPages}
        >
          下一页
        </button>
      </div>
    </div>
  );
};

export default InterestGroup;
