/* Platform Admin shell — sidebar, topbar, page router */

function PlatformAdminPage({ lang, setLang, t }) {
  // section comes from hash: #/admin/section
  const getHashSection = () => {
    const h = window.location.hash || "#/admin";
    const parts = h.replace(/^#\//, "").split("/");
    return parts[1] || "overview";
  };
  const [section, setSection] = React.useState(getHashSection());
  const [drawer, setDrawer] = React.useState(null); // approval detail
  const [mobileOpen, setMobileOpen] = React.useState(false);
  const [toast, setToast] = React.useState(null);
  const [dataKey, setDataKey] = React.useState(0);
  const [search, setSearch] = React.useState("");

  // Auth gate — only admin/superadmin roles may access
  const { user, loading: authLoading } = useAuth();
  const [adminCheck, setAdminCheck] = React.useState({ checking: true, allowed: false, error: "" });

  React.useEffect(() => {
    if (authLoading) return;
    if (!user) {
      setAdminCheck({ checking: false, allowed: false, error: "" });
      return;
    }
    window.sb.from("profiles").select("role, full_name").eq("id", user.id).single()
      .then(({ data, error }) => {
        if (error) {
          setAdminCheck({ checking: false, allowed: false, error: error.message });
          return;
        }
        const role = data?.role;
        const ok = role === "admin" || role === "superadmin";
        setAdminCheck({ checking: false, allowed: ok, error: ok ? "" : `Role "${role}" cannot access admin.`, name: data?.full_name || "", role });
      });
  }, [user, authLoading]);

  React.useEffect(() => {
    const onHash = () => setSection(getHashSection());
    window.addEventListener("hashchange", onHash);
    return () => window.removeEventListener("hashchange", onHash);
  }, []);

  // F1 — close any open approval drawer when the active section changes.
  // Otherwise the drawer stays mounted (its backdrop unmounts via the new
  // section's render) and intercepts clicks, blocking the new section.
  React.useEffect(() => {
    setDrawer(null);
  }, [section]);

  // Load live admin data only after auth check passes
  React.useEffect(() => {
    if (!adminCheck.allowed) return;
    window._adminRefreshCallback = () => setDataKey(k => k + 1);
    if (window.loadAdminData) {
      window.loadAdminData();
    }
    return () => { window._adminRefreshCallback = null; };
  }, [adminCheck.allowed]);

  const goto = (s) => {
    window.location.hash = `#/admin/${s}`;
    setSection(s);
    setMobileOpen(false);
  };

  const openApproval = (a) => setDrawer(a);

  // Topbar search — a real "jump to section" command. Matches the typed
  // query against section labels (EN + AR) and navigates to the first hit.
  const runSearch = () => {
    const term = search.trim().toLowerCase();
    if (!term) return;
    const hit = sections.find(s =>
      (s.en || "").toLowerCase().includes(term) ||
      (s.ar || "").includes(search.trim()) ||
      s.k.includes(term)
    );
    if (hit) { goto(hit.k); setSearch(""); }
  };

  const handleAction = async (approval, action, note) => {
    // AP-3 — "changes" is a distinct change-request decision, not a reject.
    const decision = action === "approve" ? "approved"
      : action === "changes" ? "changes_requested"
      : "rejected";
    const apTitleEn = window.approvalTitle ? window.approvalTitle(approval, "en") : approval.title;
    const apTitleAr = window.approvalTitle ? window.approvalTitle(approval, "ar") : approval.title;
    const labels = {
      approve: { en: `Approved · ${apTitleEn}`, ar: `تمّت الموافقة · ${apTitleAr}` },
      reject: { en: `Rejected · ${apTitleEn}`, ar: `رُفض · ${apTitleAr}` },
      changes: { en: `Changes requested · ${apTitleEn}`, ar: `طُلب تعديل · ${apTitleAr}` },
    };

    try {
      const { data: { session } } = await window.sb.auth.getSession();
      const token = session?.access_token;
      const res = await fetch(`${window.SB_URL}/functions/v1/approval_decide`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "apikey": window.SB_ANON,
          "Authorization": `Bearer ${token}`,
        },
        body: JSON.stringify({
          id: approval.id,
          decision,
          reviewer_note: note || null,
        }),
      });
      const data = await res.json();
      if (!res.ok) throw new Error(data.error || "Action failed");
      setToast({ text: labels[action][lang] || labels[action].en, kind: action });
      setDrawer(null);
      setTimeout(() => setToast(null), 3500);
      // Reload admin data to reflect the change
      if (window.loadAdminData) window.loadAdminData();
    } catch (ex) {
      setToast({ text: ex.message || "Action failed", kind: "reject" });
      setTimeout(() => setToast(null), 4000);
    }
  };

  const sections = [
    { k: "overview", en: "Overview", ar: "النظرة العامّة", icon: "sun" },
    { k: "approvals", en: "Approvals", ar: "الموافقات", icon: "check", badge: window.ADMIN_APPROVALS.length },
    { k: "applications", en: "Applications", ar: "طلبات الانضمام", icon: "feather", badge: (window.ADMIN_APPLICATIONS || []).filter(window.isOpenApplication).length || undefined },
    { k: "makers", en: "Makers", ar: "الصنّاع", icon: "hand" },
    { k: "pieces", en: "Pieces", ar: "القطع", icon: "box" },
    { k: "pieces-images", en: "Pieces & Images", ar: "القطع والصور", icon: "eye" },
    { k: "orders", en: "Orders", ar: "الطلبات", icon: "basket" },
    { k: "returns", en: "Returns", ar: "المرتجعات", icon: "arrow", badge: (window.ADMIN_OPEN_RETURNS || 0) || undefined },
    { k: "customers", en: "Customers", ar: "العملاء", icon: "cup" },
    { k: "finance", en: "Finance", ar: "الماليّة", icon: "wax" },
    { k: "workshops", en: "Workshops", ar: "ورش العمل", icon: "scissors" },
    { k: "content", en: "Journal & content", ar: "المحتوى", icon: "feather" },
    { k: "audit", en: "Audit log", ar: "السجلّ", icon: "calendar" },
    { k: "team", en: "Team & roles", ar: "الفريق", icon: "star" },
    { k: "settings", en: "Settings", ar: "الإعدادات", icon: "moon" },
  ];

  // First name for the greeting — falls back to the email local-part, then null
  // (OverviewPage renders a neutral greeting when there's no name).
  const firstName = (adminCheck.name && adminCheck.name.trim().split(/\s+/)[0])
    || (user?.email ? user.email.split("@")[0] : "")
    || "";

  let body = null;
  switch (section) {
    case "overview": body = <OverviewPage lang={lang} openApproval={openApproval} gotoSection={goto} firstName={firstName} />; break;
    case "approvals": body = <ApprovalsPage lang={lang} openApproval={openApproval} />; break;
    case "applications": body = <ApplicationsPage lang={lang} />; break;
    case "makers": body = <AdminMakersPage lang={lang} openApproval={openApproval} />; break;
    case "pieces": body = <AdminPiecesPage lang={lang} />; break;
    case "pieces-images": body = <AdminPiecesImagesPage lang={lang} />; break;
    case "orders": body = <AdminOrdersPage lang={lang} />; break;
    case "returns": body = <AdminReturnsPage lang={lang} />; break;
    case "customers": body = <AdminCustomersPage lang={lang} />; break;
    case "finance": body = <AdminFinancePage lang={lang} />; break;
    case "workshops": body = <AdminWorkshopsPage lang={lang} />; break;
    case "content": body = <AdminContentPage lang={lang} />; break;
    case "audit": body = <AdminAuditPage lang={lang} />; break;
    case "team": body = <AdminTeamPage lang={lang} />; break;
    case "settings": body = <AdminSettingsPage lang={lang} />; break;
    default: body = <OverviewPage lang={lang} openApproval={openApproval} gotoSection={goto} firstName={firstName} />;
  }

  const sectionMeta = sections.find(s => s.k === section) || sections[0];

  // Auth gate — block render until allowed
  if (authLoading || adminCheck.checking) {
    return (
      <div style={{ minHeight: "100vh", background: "var(--paper)", display: "grid", placeItems: "center", fontFamily: "var(--ff-mono)", fontSize: 12, color: "var(--muted)", letterSpacing: "0.2em", textTransform: "uppercase" }}>
        Verifying access…
      </div>
    );
  }

  if (!adminCheck.allowed) {
    return (
      <div style={{ minHeight: "100vh", background: "var(--paper)", display: "grid", placeItems: "center", padding: 40 }}>
        <div style={{ maxWidth: 480, textAlign: "center" }}>
          <Star8 size={32} color="var(--terracotta)" />
          <h1 style={{ fontFamily: "var(--ff-display)", fontSize: 48, marginTop: 20, lineHeight: 1.1 }}>
            {!user
              ? (lang === "en" ? "Admin sign-in required." : "تسجيل دخول الإدارة مطلوب.")
              : (lang === "en" ? "Access denied." : "الوصول مرفوض.")}
          </h1>
          <p style={{ marginTop: 16, color: "var(--olive)", fontSize: 15 }}>
            {!user
              ? (lang === "en" ? "Sign in with an admin account to manage the platform." : "سجّل دخول بحساب إدارة لإدارة المنصة.")
              : (lang === "en" ? "Your account does not have admin privileges." : "حسابك ليس لديه صلاحيات إدارة.")}
          </p>
          {adminCheck.error && (
            <p style={{ marginTop: 8, fontFamily: "var(--ff-mono)", fontSize: 10, letterSpacing: "0.18em", color: "var(--muted)" }}>
              {adminCheck.error}
            </p>
          )}
          <div style={{ marginTop: 28, display: "flex", gap: 12, justifyContent: "center", flexWrap: "wrap" }}>
            <a href="#/account" className="btn">
              {lang === "en" ? (user ? "Switch account" : "Sign in") : (user ? "تبديل الحساب" : "تسجيل الدخول")} →
            </a>
            <a href="#/" className="btn ghost">
              {lang === "en" ? "Back to site" : "للموقع"}
            </a>
          </div>
        </div>
      </div>
    );
  }

  return (
    <div style={{ minHeight: "100vh", background: "var(--paper-2)", color: "var(--ink)" }} dir={lang === "ar" ? "rtl" : "ltr"}>
      {/* Top bar (admin-specific, replaces site nav) */}
      <header style={{
        position: "sticky", top: 0, zIndex: 50,
        background: "var(--ink)", color: "var(--paper)",
        borderBottom: "1px solid rgba(244,237,226,0.08)",
      }}>
        <div style={{ display: "flex", alignItems: "center", gap: 16, padding: "12px 22px", maxWidth: 1700, margin: "0 auto" }}>
          <button onClick={() => setMobileOpen(true)} className="adm-burger"
            aria-label={lang === "en" ? "Open menu" : "افتح القائمة"} style={{
            background: "transparent", border: "1px solid rgba(244,237,226,0.16)", borderRadius: 8,
            color: "var(--paper)", padding: "7px 10px", cursor: "pointer", display: "none",
            alignItems: "center", justifyContent: "center",
          }}>
            <span aria-hidden="true" style={{ display: "inline-flex", flexDirection: "column", gap: 3, width: 16 }}>
              <span style={{ height: 1.5, background: "var(--paper)", borderRadius: 2 }} />
              <span style={{ height: 1.5, background: "var(--paper)", borderRadius: 2 }} />
              <span style={{ height: 1.5, background: "var(--paper)", borderRadius: 2 }} />
            </span>
          </button>
          <a href="#/" style={{ display: "flex", alignItems: "center", gap: 10, color: "var(--paper)", textDecoration: "none" }}>
            <Wordmark size={16} />
            <span style={{
              padding: "3px 10px", borderRadius: 999,
              background: "var(--gold)", color: "var(--ink)",
              fontFamily: "var(--ff-mono)", fontSize: 9, letterSpacing: "0.22em", textTransform: "uppercase", fontWeight: 600,
            }}>Admin</span>
          </a>
          <div style={{ flex: 1 }} />
          <form className="adm-search" onSubmit={(e) => { e.preventDefault(); runSearch(); }} style={{ display: "flex", alignItems: "center", gap: 8, padding: "6px 14px", border: "1px solid rgba(244,237,226,0.14)", borderRadius: 999, background: "rgba(244,237,226,0.04)", minWidth: 280 }}>
            <span style={{ display: "inline-flex", color: "rgba(244,237,226,0.55)" }}><Icon name="search" size={15} /></span>
            <input
              value={search}
              onChange={(e) => setSearch(e.target.value)}
              placeholder={lang === "en" ? "Jump to a section…" : "اذهب إلى قسم…"}
              aria-label={lang === "en" ? "Jump to a section" : "اذهب إلى قسم"}
              style={{
                flex: 1, background: "transparent", border: 0, color: "var(--paper)",
                fontFamily: "var(--ff-sans)", fontSize: 13, outline: "none",
              }} />
          </form>
          <button onClick={() => setLang(lang === "en" ? "ar" : "en")} style={{
            background: "transparent", border: "1px solid rgba(244,237,226,0.16)", borderRadius: 999,
            color: "var(--paper)", padding: "7px 14px", cursor: "pointer",
            fontFamily: "var(--ff-mono)", fontSize: 10, letterSpacing: "0.22em", textTransform: "uppercase",
          }}>{lang === "en" ? "ع" : "EN"}</button>
          {(() => {
            const displayName = adminCheck.name || (user?.email ? user.email.split("@")[0] : (lang === "en" ? "Admin" : "إداري"));
            const roleLabel = adminCheck.role === "superadmin"
              ? (lang === "en" ? "Owner" : "المالك")
              : (lang === "en" ? "Admin" : "إداري");
            const initial = (displayName || "A").trim().charAt(0).toUpperCase();
            return (
              <div style={{ display: "flex", alignItems: "center", gap: 10, padding: "5px 5px 5px 14px", border: "1px solid rgba(244,237,226,0.14)", borderRadius: 999 }} className="adm-user">
                <div style={{ display: "flex", flexDirection: "column", alignItems: "flex-end" }}>
                  <span style={{ fontSize: 12, maxWidth: 140, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{displayName}</span>
                  <span style={{ fontFamily: "var(--ff-mono)", fontSize: 9, letterSpacing: "0.18em", color: "var(--gold-soft)", textTransform: "uppercase" }}>{roleLabel}</span>
                </div>
                <div style={{ width: 32, height: 32, borderRadius: "50%", background: "var(--gold)", color: "var(--ink)", display: "grid", placeItems: "center", fontFamily: "var(--ff-display)", fontSize: 14 }}>{initial}</div>
              </div>
            );
          })()}
        </div>
      </header>

      {/* Layout */}
      <div style={{ maxWidth: 1700, margin: "0 auto", display: "grid", gridTemplateColumns: "260px 1fr", gap: 0 }} className="adm-layout">
        {/* Sidebar */}
        <aside className="adm-sidebar" style={{
          padding: "26px 18px", borderRight: "1px solid var(--line-2)",
          minHeight: "calc(100vh - 60px)", background: "var(--paper)",
          position: "sticky", top: 60, alignSelf: "start", maxHeight: "calc(100vh - 60px)", overflowY: "auto",
        }}>
          <div style={{ padding: "0 6px 14px", marginBottom: 8, borderBottom: "1px solid var(--line-2)" }}>
            <div style={{ fontFamily: "var(--ff-mono)", fontSize: 9, letterSpacing: "0.22em", textTransform: "uppercase", color: "var(--muted)" }}>{lang === "en" ? "Platform" : "المنصّة"}</div>
            <div style={{ marginTop: 4, fontFamily: "var(--ff-display)", fontSize: 22, fontStyle: "italic" }}>SANAA control</div>
          </div>
          <nav style={{ display: "flex", flexDirection: "column", gap: 2 }}>
            {sections.map(s => (
              <button key={s.k} onClick={() => goto(s.k)} style={{
                display: "flex", alignItems: "center", gap: 12,
                padding: "10px 14px", borderRadius: 10, border: 0,
                background: section === s.k ? "var(--paper-2)" : "transparent",
                color: section === s.k ? "var(--ink)" : "var(--muted)",
                fontFamily: "var(--ff-sans)", fontSize: 13, cursor: "pointer", textAlign: "left",
                position: "relative",
              }}>
                <span style={{ width: 18, display: "inline-flex", justifyContent: "center", color: section === s.k ? "var(--terracotta)" : "var(--muted)" }}><Icon name={s.icon} size={17} /></span>
                <span style={{ flex: 1 }}>{s[lang] || s.en}</span>
                {s.badge && (
                  <span style={{
                    background: "var(--terracotta)", color: "var(--paper)",
                    padding: "1px 7px", borderRadius: 999,
                    fontFamily: "var(--ff-mono)", fontSize: 9, letterSpacing: "0.1em", fontWeight: 600,
                  }}>{s.badge}</span>
                )}
                {section === s.k && (
                  <span style={{ position: "absolute", left: 0, top: "20%", bottom: "20%", width: 2, background: "var(--terracotta)", borderRadius: 2 }} />
                )}
              </button>
            ))}
          </nav>
          <div style={{ marginTop: 20, padding: "12px 14px", border: "1px dashed var(--line-2)", borderRadius: 10 }}>
            <div style={{ fontFamily: "var(--ff-mono)", fontSize: 9, letterSpacing: "0.22em", textTransform: "uppercase", color: "var(--muted)" }}>{lang === "en" ? "Workspace" : "مساحة العمل"}</div>
            <div style={{ marginTop: 8, display: "flex", alignItems: "center", gap: 8, fontSize: 12, color: "var(--muted)" }}>
              <span style={{ display: "inline-flex", color: "var(--gold)" }}><Icon name="pin" size={15} /></span>
              {lang === "en" ? "SANAA atelier · Cairo" : "محترف صَنعة · القاهرة"}
            </div>
          </div>
        </aside>

        {/* Mobile drawer */}
        {mobileOpen && (
          <div onClick={() => setMobileOpen(false)} style={{ position: "fixed", inset: 0, background: "rgba(0,0,0,0.5)", zIndex: 90, display: "none" }} className="adm-mobile-overlay">
            <div onClick={e => e.stopPropagation()} style={{ width: 280, height: "100%", background: "var(--paper)", padding: "20px 14px", overflow: "auto" }}>
              <div style={{ fontFamily: "var(--ff-display)", fontSize: 22, fontStyle: "italic", marginBottom: 16 }}>SANAA control</div>
              {sections.map(s => (
                <button key={s.k} onClick={() => goto(s.k)} style={{
                  display: "flex", alignItems: "center", gap: 12,
                  padding: "12px 14px", borderRadius: 10, border: 0,
                  background: section === s.k ? "var(--paper-2)" : "transparent",
                  color: "var(--ink)", fontSize: 14, cursor: "pointer", textAlign: "left", width: "100%",
                }}>
                  <span style={{ width: 18, display: "inline-flex", justifyContent: "center", color: section === s.k ? "var(--terracotta)" : "var(--muted)" }}><Icon name={s.icon} size={17} /></span>
                  <span style={{ flex: 1 }}>{s[lang] || s.en}</span>
                  {s.badge && <span style={{ background: "var(--terracotta)", color: "var(--paper)", padding: "1px 7px", borderRadius: 999, fontSize: 10 }}>{s.badge}</span>}
                </button>
              ))}
            </div>
          </div>
        )}

        {/* Main */}
        <main style={{ padding: "30px 32px 80px", minWidth: 0 }} className="adm-main">
          {/* Title bar */}
          <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 24, gap: 16, flexWrap: "wrap" }}>
            <div>
              <div style={{ fontFamily: "var(--ff-mono)", fontSize: 10, letterSpacing: "0.22em", textTransform: "uppercase", color: "var(--muted)" }}>
                {lang === "en" ? "Platform admin" : "إدارة المنصّة"} · {sectionMeta[lang] || sectionMeta.en}
              </div>
              <h1 style={{ fontFamily: "var(--ff-display)", fontSize: "clamp(32px, 4vw, 48px)", lineHeight: 1, marginTop: 6 }}>
                {sectionMeta[lang] || sectionMeta.en}
              </h1>
            </div>
          </div>

          <div key={dataKey}>{body}</div>
        </main>
      </div>

      {/* Approval drawer */}
      <ApprovalDrawer approval={drawer} onClose={() => setDrawer(null)} lang={lang} onAction={handleAction} />

      {/* Toast */}
      {toast && (
        <div style={{
          position: "fixed", bottom: 24, left: "50%", transform: "translateX(-50%)", zIndex: 100,
          padding: "14px 22px", borderRadius: 999,
          background: toast.kind === "approve" ? "var(--olive)" : toast.kind === "reject" ? "var(--terracotta)" : "var(--gold)",
          color: toast.kind === "changes" ? "var(--ink)" : "var(--paper)",
          fontFamily: "var(--ff-sans)", fontSize: 13, fontWeight: 500,
          boxShadow: "0 14px 40px rgba(0,0,0,0.25)",
          display: "flex", alignItems: "center", gap: 10,
        }}>
          <span style={{ display: "inline-flex" }}>
            <Icon name={toast.kind === "approve" ? "check" : toast.kind === "reject" ? "knot" : "arrow"} size={16} color="currentColor" />
          </span>
          {toast.text}
        </div>
      )}

      <style>{`
        @media (max-width: 980px) {
          .adm-layout { grid-template-columns: 1fr !important; }
          .adm-sidebar { display: none !important; }
          .adm-burger { display: inline-block !important; }
          .adm-mobile-overlay { display: block !important; }
          .adm-search { min-width: 0 !important; flex: 1; }
          .adm-user { display: none !important; }
          .adm-main { padding: 22px 16px 60px !important; }
        }
        @media (max-width: 700px) {
          .adm-grid-2 { grid-template-columns: 1fr !important; }
          .adm-grid-3 { grid-template-columns: 1fr !important; }
          .adm-grid-4 { grid-template-columns: repeat(2, 1fr) !important; }
          .adm-hero { grid-template-columns: 1fr !important; }
        }
        .adm-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
        .adm-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
        .adm-grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
      `}</style>
    </div>
  );
}

window.PlatformAdminPage = PlatformAdminPage;
