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";

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" },
];

const sportTypes = [""];

const areaTabs = [
  { label: "篮球", icon: <MovieIcon fontSize="small" /> },
  { label: "足球", icon: <EmailIcon fontSize="small" /> },
  { label: "羽毛球", icon: <EmojiPeopleIcon fontSize="small" /> },
  { label: "排球", icon: <PersonIcon fontSize="small" /> },
  { label: "电竞", icon: <PersonIcon fontSize="small" />, active: true },
];

export default function SportPage() {
  const navigate = useNavigate();
  const [activeTab, setActiveTab] = React.useState(0);

  // 每个tab对应的运动类型
  const sportTypesList = [
    ["篮球赛事", "篮球技巧", "篮球明星"], // 篮球
    ["足球赛事", "足球技巧", "足球明星"], // 足球
    ["羽毛球赛事", "羽毛球技巧"], // 羽毛球
    ["排球赛事", "排球技巧"], // 排球
    ["电竞赛事", "电竞技巧"], // 电竞
  ];
  const sportTypes = sportTypesList[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="movie-table">
          <thead>
            <tr>
              <th>类型</th>
              <th>标题</th>
              <th>发布者</th>
            </tr>
          </thead>
          <tbody>
            {sportTypes.map((type) => (
              <tr key={type}>
                <td>{type}</td>
                <td></td>
                <td></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>
  );
}
