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 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 },
];

export default function InfoPage() {
  const navigate = useNavigate();
  const [activeTab, setActiveTab] = React.useState(0);

  // 每个tab对应的资料类型
  const infoTypesList = [
    ["出版物A", "出版物B", "出版物C"], // 出版物
    ["教程A", "教程B", "教程C"], // 学习教程
    ["模板A", "模板B"], // 素材模板
    ["演讲A", "演讲B"], // 演讲交流
    ["娱乐A", "娱乐B"], // 日常娱乐
  ];
  const infoTypes = infoTypesList[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>
            {infoTypes.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>
  );
}
