// app.jsx — main shell, routing, theme + lang state, auth gating
// (TweaksPanel/mobile-frame stripped — those were design-tool affordances.)

function App() {
  const [theme, setTheme] = React.useState(() => {
    try { return localStorage.getItem("rawj_theme") || window.RAWJ_CONFIG.DEFAULT_THEME; } catch { return "light"; }
  });
  const [lang, setLangState] = React.useState(() => {
    try { return localStorage.getItem("rawj_lang") || window.RAWJ_CONFIG.DEFAULT_LANG; } catch { return "ar"; }
  });
  const dir = lang === "ar" ? "rtl" : "ltr";

  const [route, setRoute] = React.useState(() => {
    if (typeof location !== "undefined" && location.hash) {
      return location.hash.replace(/^#/, "") || "landing";
    }
    return "landing";
  });
  const [user, setUser] = React.useState(null);
  const [bootDone, setBootDone] = React.useState(false);

  const setLang = React.useCallback((l) => {
    setLangState(l);
    try { localStorage.setItem("rawj_lang", l); } catch {}
  }, []);
  const toggleTheme = React.useCallback(() => {
    setTheme(prev => {
      const next = prev === "light" ? "dark" : "light";
      try { localStorage.setItem("rawj_theme", next); } catch {}
      return next;
    });
  }, []);

  // Apply theme/dir/lang to <html>
  React.useEffect(() => {
    const root = document.documentElement;
    root.dir = dir;
    root.lang = lang;
    root.dataset.theme = theme;
    root.dataset.density = "regular";
  }, [theme, dir, lang]);

  // Sync route → URL hash (so Back button works + shareable)
  React.useEffect(() => {
    if (typeof location === "undefined") return;
    const want = "#" + route;
    if (location.hash !== want) location.hash = want;
  }, [route]);

  // Listen for hash changes (back button)
  React.useEffect(() => {
    function onHash() {
      const r = location.hash.replace(/^#/, "") || "landing";
      setRoute(r);
    }
    window.addEventListener("hashchange", onHash);
    return () => window.removeEventListener("hashchange", onHash);
  }, []);

  // Boot: try to load current user from session
  React.useEffect(() => {
    let cancelled = false;
    (async () => {
      if (API.hasSession()) {
        const u = await API.me();
        if (!cancelled) setUser(u);
      }
      if (!cancelled) setBootDone(true);
    })();
    return () => { cancelled = true; };
  }, []);

  const isAuthRoute = route === "login" || route === "signup" || route === "forgot";
  const isPublicRoute = route === "landing" || isAuthRoute;

  // Routes that require auth
  const protectedRoutes = new Set(["dashboard", "accounts", "alerts", "notifs", "report", "schedule", "account", "onboard", "settings"]);

  // If user is not authed and tries to access a protected route → redirect to login
  React.useEffect(() => {
    if (!bootDone) return;
    if (!user && protectedRoutes.has(route)) {
      setRoute("login");
    }
  }, [bootDone, user, route]);

  function onAuthSuccess(u) {
    setUser(u);
    setRoute("dashboard");
  }
  async function signOut() {
    await API.logout();
    setUser(null);
    setRoute("landing");
  }

  // Pre-boot: render lightweight shell to avoid flash
  if (!bootDone) {
    return (
      <div style={{ display: "grid", placeItems: "center", height: "100vh", color: "var(--muted)" }}>
        {lang === "ar" ? "جاري التحميل…" : "Loading…"}
      </div>
    );
  }

  // ───── Public routes ──────────────────────────────
  if (route === "landing") {
    return (
      <>
        <PublicTopBar lang={lang} setLang={setLang} setRoute={setRoute} user={user} />
        <Landing lang={lang} setRoute={setRoute} />
      </>
    );
  }
  if (route === "login")   return <LoginScreen lang={lang} setRoute={setRoute} onAuthSuccess={onAuthSuccess} />;
  if (route === "signup")  return <SignupScreen lang={lang} setRoute={setRoute} onAuthSuccess={onAuthSuccess} />;
  if (route === "forgot")  return <ForgotScreen lang={lang} setRoute={setRoute} />;

  // ───── Authenticated routes ──────────────────────
  const titles = {
    dashboard: lang === "ar" ? "لوحة التحكم" : "Dashboard",
    accounts: lang === "ar" ? "الحسابات الإعلانية" : "Ad Accounts",
    alerts: lang === "ar" ? "تنبيهات المديونيات" : "Debt alerts",
    notifs: lang === "ar" ? "قنوات الإشعارات" : "Notification channels",
    report: lang === "ar" ? "بناء التقرير" : "Report builder",
    schedule: lang === "ar" ? "جدولة التقارير" : "Report schedule",
    account: lang === "ar" ? "تفاصيل الحساب" : "Account detail",
    onboard: lang === "ar" ? "ربط الحسابات" : "Connect accounts",
    settings: lang === "ar" ? "الإعدادات" : "Settings",
  };
  const crumbs = {
    dashboard: lang === "ar" ? "روّج برو · العمليات" : "Rawj Pro · Operations",
    accounts: lang === "ar" ? "روّج برو · العمليات" : "Rawj Pro · Operations",
    alerts: lang === "ar" ? "روّج برو · العمليات" : "Rawj Pro · Operations",
    notifs: lang === "ar" ? "روّج برو · الإعداد" : "Rawj Pro · Setup",
    report: lang === "ar" ? "روّج برو · الإعداد" : "Rawj Pro · Setup",
    schedule: lang === "ar" ? "روّج برو · الإعداد" : "Rawj Pro · Setup",
    account: lang === "ar" ? "العمليات · الحسابات" : "Operations · Accounts",
    onboard: lang === "ar" ? "روّج برو" : "Rawj Pro",
    settings: lang === "ar" ? "روّج برو · الحساب" : "Rawj Pro · Account",
  };

  const screen = (() => {
    switch (route) {
      case "onboard":   return <Onboarding lang={lang} setRoute={setRoute} />;
      case "dashboard":
      case "accounts":  return <Dashboard lang={lang} setRoute={setRoute} />;
      case "account":   return <AccountDetail lang={lang} setRoute={setRoute} />;
      case "alerts":    return <Alerts lang={lang} />;
      case "notifs":    return <Notifications lang={lang} />;
      case "report":    return <ReportBuilder lang={lang} />;
      case "schedule":  return <Schedule lang={lang} />;
      case "settings":  return <Settings lang={lang} user={user} onSignout={signOut} />;
      default:          return <Dashboard lang={lang} setRoute={setRoute} />;
    }
  })();

  const headerRight = (
    <>
      <button className="btn btn-sm" onClick={toggleTheme} title={lang === "ar" ? "تبديل المظهر" : "Toggle theme"}>
        {theme === "light" ? <Icon.moon size={13} /> : <Icon.sun size={13} />}
      </button>
      <button className="btn btn-sm" onClick={() => setRoute("alerts")}><Icon.bell size={13} /></button>
      {(route === "dashboard" || route === "accounts") && (
        <button className="btn btn-sm btn-primary" onClick={() => setRoute("onboard")}>
          <Icon.add size={13} /> {lang === "ar" ? "حساب جديد" : "New account"}
        </button>
      )}
    </>
  );

  return (
    <div className="app">
      <SideNavWithAccount route={route} setRoute={setRoute} lang={lang} user={user} onSignout={signOut} />
      <main style={{ minWidth: 0 }}>
        <TopBar crumb={crumbs[route]} title={titles[route]} lang={lang} setLang={setLang} right={headerRight} />
        {screen}
      </main>
    </div>
  );
}

// ─── Public top bar (landing page only) ─────────────────────────────
function PublicTopBar({ lang, setLang, setRoute, user }) {
  // The Landing component has its own header; this is a no-op shim.
  return null;
}

// ─── Side nav with real user data + settings link + sign out ────────
function SideNavWithAccount({ route, setRoute, lang, user, onSignout }) {
  const L = useT(lang);
  const items = [
    { group: L.work, links: [
      { id: "dashboard", label: L.dashboard, icon: "home" },
      { id: "accounts",  label: L.accounts,  icon: "grid" },
      { id: "alerts",    label: L.alerts,    icon: "alert" },
    ]},
    { group: L.setup, links: [
      { id: "onboard",  label: L.onboard,  icon: "link" },
      { id: "report",   label: L.report,   icon: "doc" },
      { id: "schedule", label: L.schedule, icon: "cal" },
      { id: "notifs",   label: L.notifs,   icon: "bell" },
    ]},
  ];
  const initials = (user?.name || user?.email || "?").slice(0, 2).toUpperCase();
  return (
    <nav className="sidenav">
      <button className="brand" onClick={() => setRoute("landing")} style={{ background: "transparent", border: 0, cursor: "default", padding: "4px 8px 18px" }}>
        <div className="brand-mark">R</div>
        <div className="brand-name">
          <b>{lang === "ar" ? "روّج برو" : "Rawj Pro"}</b>
          <span>rawj.pro</span>
        </div>
      </button>
      {items.map((g) => (
        <React.Fragment key={g.group}>
          <div className="nav-group">{g.group}</div>
          {g.links.map((l) => {
            const Ic = Icon[l.icon];
            return (
              <button key={l.id} className="nav-item" aria-current={route === l.id ? "page" : null}
                      onClick={() => setRoute(l.id)}>
                <Ic />
                <span>{l.label}</span>
              </button>
            );
          })}
        </React.Fragment>
      ))}
      <button className="user-card" onClick={() => setRoute("settings")} style={{ border: "1px solid var(--line)", cursor: "default", textAlign: "start" }}>
        <div className="avatar">{initials}</div>
        <div style={{ minWidth: 0, flex: 1 }}>
          <div className="who" style={{ overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>
            {user?.name || (lang === "ar" ? "حسابك" : "Your account")}
          </div>
          <div className="role">
            {user?.plan
              ? (user.plan === "unlimited" ? (lang === "ar" ? "اشتراك غير محدود" : "Unlimited plan")
                : user.plan === "pro" ? (lang === "ar" ? "ثلاث منصات" : "Pro")
                : (lang === "ar" ? "منصة واحدة" : "Solo"))
              : (lang === "ar" ? "إعدادات" : "Settings")}
          </div>
        </div>
        <Icon.cog size={14} />
      </button>
    </nav>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<App />);
