import { BrowserRouter, Navigate, Route, Routes } from "react-router-dom";
import { useEffect, useState } from "react";
import { Spin } from "antd";
import { api, getToken } from "./api";
import LoginPage from "./pages/LoginPage";
import MainLayout from "./layout/MainLayout";
import ScoreQueryPage from "./pages/ScoreQueryPage";
import AttemptReviewPage from "./pages/AttemptReviewPage";
import AdminImportPage from "./pages/AdminImportPage";
import AdminGradersPage from "./pages/AdminGradersPage";
import AdminSystemSettingsPage from "./pages/AdminSystemSettingsPage";
import AdminRoute from "./AdminRoute";

export type UserMe = { id: number; username: string; display_name: string; role: string };

function App() {
  const [user, setUser] = useState<UserMe | null>(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    if (!getToken()) {
      setLoading(false);
      return;
    }
    api
      .get<UserMe>("/api/auth/me")
      .then((r) => setUser(r.data))
      .catch(() => setUser(null))
      .finally(() => setLoading(false));
  }, []);

  if (loading) {
    return (
      <div style={{ display: "flex", height: "100vh", alignItems: "center", justifyContent: "center" }}>
        <Spin size="large" />
      </div>
    );
  }

  return (
    <BrowserRouter>
      <Routes>
        <Route path="/login" element={<LoginPage onLogin={setUser} />} />
        <Route
          path="/"
          element={user ? <MainLayout user={user} onLogout={() => setUser(null)} /> : <Navigate to="/login" />}
        >
          <Route index element={<Navigate to="/scores" replace />} />
          <Route path="scores" element={<ScoreQueryPage />} />
          <Route path="attempts/:attemptId" element={<AttemptReviewPage />} />
          <Route
            path="admin/import"
            element={<AdminRoute user={user}><AdminImportPage /></AdminRoute>}
          />
          <Route
            path="admin/graders"
            element={<AdminRoute user={user}><AdminGradersPage /></AdminRoute>}
          />
          <Route
            path="admin/settings"
            element={<AdminRoute user={user}><AdminSystemSettingsPage /></AdminRoute>}
          />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

export default App;
