import React from "react";
import MovieIcon from "@mui/icons-material/Movie";
import EmailIcon from "@mui/icons-material/Email";
import MusicNoteIcon from "@mui/icons-material/MusicNote";
import EmojiPeopleIcon from "@mui/icons-material/EmojiPeople";
import SportsEsportsIcon from "@mui/icons-material/SportsEsports";
import SportsMartialArtsIcon from "@mui/icons-material/SportsMartialArts";
import PersonIcon from "@mui/icons-material/Person";
import AccountCircleIcon from "@mui/icons-material/AccountCircle";
import "./App.css";
import { useNavigate } from "react-router-dom";
import { API_BASE_URL } from "./config";

const navItems = [
  { label: "电影", icon: <MovieIcon />, path: "/movie" },
  { label: "剧集", icon: <EmailIcon />, path: "/tv" },
  { label: "音乐", icon: <MusicNoteIcon />, path: "/music" },
  { label: "动漫", icon: <EmojiPeopleIcon />, path: "/anime" },
  { label: "游戏", icon: <SportsEsportsIcon />, path: "/game" },
  { label: "体育", icon: <SportsMartialArtsIcon />, path: "/sport" },
  { label: "资料", icon: <PersonIcon />, path: "/info" },
  { label: "发布", icon: <AccountCircleIcon />, path: "/publish" }, // Added Publish option
];

const infoTypes = [""];

const areaTabs = [
  { label: "出版物", icon: <MovieIcon fontSize="small" /> },
  { label: "学习教程", icon: <EmailIcon fontSize="small" /> },
  { label: "素材模板", icon: <PersonIcon fontSize="small" /> },
  { label: "演讲交流", icon: <EmojiPeopleIcon fontSize="small" /> },
  { label: "日常娱乐", icon: <PersonIcon fontSize="small" />, active: true },
];

const exampleTorrents = [
  { type: "Documentary", title: "实例1", id: 1 },
  { type: "Biography", title: "实例2", id: 2 },
  { type: "History", title: "实例3", id: 3 },
];

export default function InfoPage() {
  const navigate = useNavigate();
  const [activeTab, setActiveTab] = React.useState(0);
  const [infoList, setInfoList] = React.useState(0);

  // 每个tab对应的资料类型
  const infoTypesList = [
    ["出版物A", "出版物B", "出版物C"], // 出版物
    ["教程A", "教程B", "教程C"], // 学习教程
    ["模板A", "模板B"], // 素材模板
    ["演讲A", "演讲B"], // 演讲交流
    ["娱乐A", "娱乐B"], // 日常娱乐
  ];
  const infoTypes = infoTypesList[activeTab] || [];

  React.useEffect(() => {
    // 这里假设后端接口为 /api/get-seed-list-by-tag?tag=大陆
    const area = areaTabs[activeTab].label;
    fetch(`${API_BASE_URL}/api/get-seed-list-by-tag?tag=${encodeURIComponent(area)}`)
      .then(res => res.json())
      .then(data => {
        console.log('资料区返回数据:', data);
        setInfoList(data);
      })
      .catch(() => setInfoList([]));
  }, [activeTab]);

  return (
    <div className="container">
      {/* 顶部空白与音乐界面一致，用户栏绝对定位在页面右上角 */}
      <div style={{ height: 80 }} />
      <div
        className="user-bar"
        style={{
          position: "fixed",
          top: 18,
          right: 42,
          zIndex: 100,
          display: "flex",
          alignItems: "center",
          background: "#e0f3ff",
          borderRadius: 12,
          padding: "6px 18px",
          boxShadow: "0 2px 8px #b2d8ea",
          minWidth: 320,
          minHeight: 48,
          width: 420,
        }}
      >
        <div
          style={{ cursor: "pointer", marginRight: 16 }}
          onClick={() => navigate("/user")}
        >
          <AccountCircleIcon
            style={{
              fontSize: 38,
              color: "#1a237e",
              background: "#e0f3ff",
              borderRadius: "50%",
            }}
          />
        </div>
        <div style={{ color: "#222", fontWeight: 500, marginRight: 24 }}>
          用户栏
        </div>
        <div
          style={{
            display: "flex",
            gap: 28,
            flex: 1,
            justifyContent: "flex-end",
            alignItems: "center",
          }}
        >
          <span style={{ color: "#1976d2", fontWeight: 500 }}>
            魔力值: <b>12345</b>
          </span>
          <span style={{ color: "#1976d2", fontWeight: 500 }}>
            分享率: <b>2.56</b>
          </span>
          <span style={{ color: "#1976d2", fontWeight: 500 }}>
            上传量: <b>100GB</b>
          </span>
          <span style={{ color: "#1976d2", fontWeight: 500 }}>
            下载量: <b>50GB</b>
          </span>
        </div>
      </div>
      {/* 下方内容整体下移，留出与音乐界面一致的间距 */}
      <div style={{ height: 32 }} />
      <nav className="nav-bar card">
        {navItems.map((item) => (
          <div
            key={item.label}
            className={item.label === "资料" ? "nav-item active" : "nav-item"}
            onClick={() => navigate(item.path)}
          >
            {item.icon}
            <span>{item.label}</span>
          </div>
        ))}
      </nav>
      <div className="search-section card">
        <input className="search-input" placeholder="输入搜索关键词" />
        <button className="search-btn">
          <span role="img" aria-label="search">
            🔍
          </span>
        </button>
      </div>
      <div
        className="area-tabs"
        style={{
          display: "flex",
          justifyContent: "center",
          gap: 24,
          margin: "18px 0",
        }}
      >
        {areaTabs.map((tab, idx) => (
          <div
            key={tab.label}
            className={activeTab === idx ? "area-tab active" : "area-tab"}
            onClick={() => setActiveTab(idx)}
          >
            {tab.icon} <span>{tab.label}</span>
          </div>
        ))}
      </div>
      <div className="table-section">
        <table className="info-table">
          <thead>
            <tr>
              <th>资料类型</th>
              <th>标题</th>
              <th>发布者</th>
            </tr>
          </thead>
          <tbody>
            {infoList.length > 0 ? (
              infoList.map((item, index) => (
                <tr key={item.id || index}>
                  <td>
                    <a href={`/torrent/${item.seedid}`} style={{ color: '#1a237e', textDecoration: 'none' }}>
                      {item.seedtag}
                    </a>
                  </td>
                  <td>
                    <a href={`/torrent/${item.seedid}`} style={{ color: '#1a237e', textDecoration: 'none' }}>
                      {item.title}
                    </a>
                  </td>
                  <td>{item.user.username}</td>
                </tr>
              ))
            ) : (
              infoTypesList.map((type, index) => (
                <tr key={type}>
                  <td>
                    <a href={`/torrent/${type}`} style={{ color: '#1a237e', textDecoration: 'none' }}>
                      {type}
                    </a>
                  </td>
                  <td>
                    <a href={`/torrent/${type}`} style={{ color: '#1a237e', textDecoration: 'none' }}>
                      种子{index + 1}
                    </a>
                  </td>
                  <td>发布者{index + 1}</td>
                </tr>
              ))
            )}
          </tbody>
        </table>
      </div>
      <div style={{ height: 32 }} />
      <Pagination />
    </div>
  );
}

function Pagination() {
  const [page, setPage] = React.useState(3);
  const total = 5;
  return (
    <div className="pagination">
      <button
        onClick={() => setPage((p) => Math.max(1, p - 1))}
        disabled={page === 1}
      >
        上一页
      </button>
      <span className="page-num">
        {page}/{total}
      </span>
      <button
        onClick={() => setPage((p) => Math.min(total, p + 1))}
        disabled={page === total}
      >
        下一页
      </button>
      <span className="page-info">
        第 <b>{page}</b> 页
      </span>
    </div>
  );
}
