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'); // 默认按照成员数排序

  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);
    }
  };

  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>
              </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;
