/* ────────────────────────────────────────────────────────────
   app.jsx — 루트 앱 (세션 부트스트랩 + 라우팅 + 마운트)
   화면: 로그인/가입 → 대시보드 → 듀얼뷰 편집기.
   서버=SSOT, 쿠키 세션. 모든 데이터는 API(§3). 전역 state/localStorage 미사용.
   ──────────────────────────────────────────────────────────── */

function App() {
  const [booting, setBooting] = useState(true);
  const [user, setUser] = useState(null);
  const [route, setRoute] = useState("login");        // login | register | dashboard | editor | admin
  const [activeProject, setActiveProject] = useState(null);

  // 부트스트랩: GET /api/auth/me 로 기존 세션 복원
  useEffect(() => {
    (async () => {
      const me = await fetchMe();
      if (me) { setUser(me); setRoute("dashboard"); }
      setBooting(false);
    })();
  }, []);

  const onAuthed = useCallback((u) => { setUser(u); setRoute("dashboard"); }, []);
  const onLogout = useCallback(async () => {
    await logout();
    setUser(null); setActiveProject(null); setRoute("login");
  }, []);
  const openProject = useCallback((p) => { setActiveProject(p); setRoute("editor"); }, []);
  const backToDash = useCallback(() => { setActiveProject(null); setRoute("dashboard"); }, []);
  const openAdmin = useCallback(() => { setRoute("admin"); }, []);

  if (booting) {
    return React.createElement("div", {
      style: { minHeight: "100vh", display: "flex", alignItems: "center", justifyContent: "center", background: "var(--bg-canvas)" },
    }, React.createElement(Spinner, { s: 26 }));
  }

  if (!user) {
    return route === "register"
      ? React.createElement(RegisterView, { onAuthed, goLogin: () => setRoute("login") })
      : React.createElement(LoginView, { onAuthed, goRegister: () => setRoute("register") });
  }

  if (route === "editor" && activeProject) {
    return React.createElement(EditorView, { project: activeProject, user, onBack: backToDash, onLogout });
  }

  /* 관리자 페이지 — admin 역할만. 아니면 대시보드로 폴백. */
  if (route === "admin" && user.role === "admin") {
    return React.createElement(AdminView, { user, onBack: backToDash, onLogout });
  }

  return React.createElement(DashboardView, { user, onOpenProject: openProject, onLogout, onOpenAdmin: openAdmin });
}

/* 마운트 — 최상위 ErrorBoundary로 데이터 결함 백지 방지 */
const rootEl = document.getElementById("root");
const root = ReactDOM.createRoot(rootEl);
root.render(React.createElement(ErrorBoundary, null, React.createElement(App)));

Object.assign(window, { App });
