import React from "react";
import { BrowserRouter as Router, Routes, Route, useNavigate, Link, Navigate } from "react-router-dom";
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 ForumIcon from "@mui/icons-material/Forum";
import "./App.css";
import MoviePage from "./MoviePage";
import TVPage from "./TVPage";
import MusicPage from "./MusicPage";
import AnimePage from "./AnimePage";
import GamePage from "./GamePage";
import SportPage from "./SportPage";
import InfoPage from "./InfoPage";
import UserProfile from "./UserProfile";
import PublishPage from "./PublishPage";
import TorrentDetailPage from './TorrentDetailPage';
import ForumPage from "./ForumPage";
import PostDetailPage from "./PostDetailPage";
import LoginPage from './LoginPage';
import RegisterPage from './RegisterPage';


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: <ForumIcon />, path: "/forum" },
  { label: "发布", icon: <AccountCircleIcon />, path: "/publish" },
];

function Home() {
  const navigate = useNavigate();
  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={"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="table-section card">
        <table className="movie-table">
          <thead>
            <tr>
              <th>类型</th>
              <th>标题</th>
              <th>发布者</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>电影</td>
              <td></td>
              <td></td>
            </tr>
            <tr>
              <td>剧集</td>
              <td></td>
              <td></td>
            </tr>
            <tr>
              <td>音乐</td>
              <td></td>
              <td></td>
            </tr>
            <tr>
              <td>动漫</td>
              <td></td>
              <td></td>
            </tr>
            <tr>
              <td>游戏</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>
  );
}

function Page({ label }) {
  return (
    <div style={{ padding: 40, fontSize: 32 }}>
      {label} 页面（可自定义内容）
      <br />
      <Link to="/">返回首页</Link>
    </div>
  );
}

export default function App() {
  return (
    <Router>
      <Routes>
        <Route path="/login" element={<LoginPage />} />
        <Route path="/register" element={<RegisterPage />} />
        <Route path="/" element={<Navigate to="/login" replace />} />
        <Route path="/movie" element={<MoviePage />} />
        <Route path="/tv" element={<TVPage />} />
        <Route path="/music" element={<MusicPage />} />
        <Route path="/anime" element={<AnimePage />} />
        <Route path="/game" element={<GamePage />} />
        <Route path="/sport" element={<SportPage />} />
        <Route path="/forum" element={<ForumPage />} />
        <Route path="/forum/:postId" element={<PostDetailPage />} />
        <Route path="/info" element={<InfoPage />} />
        <Route path="/user" element={<UserProfile />} />
        <Route path="/publish" element={<PublishPage />} />
        <Route path="/torrent/:torrentId" element={<TorrentDetailPage />} />
      </Routes>
    </Router>
  );
}