// app.jsx — shell: sidebar, routing, state, tweaks
const { useState: useStateApp, useEffect: useEffectApp } = React;

const PORTAL_SESSION_KEY = "fedexPortalSession_v1";

const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "brandColor": "#4D148C",
  "accentColor": "#FF6600",
  "currency": "AUD",
  "rateMult": 1,
  "darkSidebar": true,
  "accessLevel": "manager"
}/*EDITMODE-END*/;

const NAV = [
  { group: "Bookings", items: [
    { id: "dashboard", label: "Home", icon: "layout-dashboard" },
    { id: "book", label: "Book a delivery", icon: "plus" },
    { id: "quote", label: "Get a quote", icon: "calculator" },
  ]},
  { group: "Delivery runs", items: [
    { id: "createRun", label: "Create delivery run", icon: "plus" },
    { id: "manageRuns", label: "Manage delivery runs", icon: "navigation" },
  ]},
  { group: "Manage", items: [
    { id: "history", label: "Delivery history", icon: "history" },
    { id: "addresses", label: "Address book", icon: "map-pin" },
  ]},
  { group: "Account", items: [
    { id: "invoices", label: "Invoices", icon: "file-text" },
    { id: "payment", label: "Payment methods", icon: "credit-card" },
    { id: "users", label: "Users & team", icon: "users" },
  ]},
  { group: "Support", items: [
    { id: "inquiries", label: "My inquiries", icon: "message-square" },
    { id: "depots", label: "Depots", icon: "map-pin" },
    { id: "contact", label: "Contact us", icon: "headset" },
  ]},
];
const TITLES = { dashboard: "Home", book: "Book a delivery", quote: "Get a quote", createRun: "Create delivery run", manageRuns: "Manage delivery runs", history: "Delivery history", inquiries: "My inquiries", depots: "Depots", invoices: "Invoices", payment: "Payment methods", users: "Users & team", contact: "Contact" };

function App() {
  const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
  const [page, setPage] = useStateApp("dashboard");
  const [payload, setPayload] = useStateApp(null);
  const [drawer, setDrawer] = useStateApp(false);
  const [narrow, setNarrow] = useStateApp(typeof window !== "undefined" && window.innerWidth < 940);

  const initState = window.FX.loadState();
  const [bookings, setBookings] = useStateApp(initState.bookings || []);
  const [notices, setNotices] = useStateApp(initState.notices || window.FX.NOTICES);
  const [users, setUsers] = useStateApp(initState.users || window.FX.USERS);
  const [payment, setPayment] = useStateApp(initState.payment || window.FX.PAYMENT_METHODS);
  const [activeAccountId, setActiveAccountId] = useStateApp(initState.activeAccountId || "acc1");
  const [runs, setRuns] = useStateApp(initState.runs || window.FX.DELIVERY_RUNS);
  const [savedQuotes, setSavedQuotes] = useStateApp(initState.savedQuotes || [
    { no: "Q-480021", from: "Sydney CBD", fromPc: "2000", to: "Chatswood", toPc: "2067", serviceId: "premium", vehicleId: "wagon", total: 96.4, km: 12, isReturn: false, items: [{ qty: "2", type: "Carton", l: "40", w: "30", h: "25", weight: "6" }], createdAt: new Date(Date.now() - 2 * 864e5).toISOString(), expiresAt: new Date(Date.now() + 12 * 864e5).toISOString(), status: "active" },
  ]);
  const [acctMenu, setAcctMenu] = useStateApp(false);
  const [inquiries, setInquiries] = useStateApp(window.FX.loadInquiries());
  const activeAccount = window.FX.ACCOUNTS.find(a => a.id === activeAccountId) || window.FX.ACCOUNTS[0];

  const [drafts, setDrafts] = useStateApp(initState.drafts || []);
  const [addressBook, setAddressBook] = useStateApp(initState.addressBook || window.FX.ADDRESS_BOOK);
  const [session, setSession] = useStateApp(() => { try { return JSON.parse(localStorage.getItem(PORTAL_SESSION_KEY)); } catch (e) { return null; } });

  // persist
  useEffectApp(() => { window.FX.saveState({ bookings, notices, users, payment, activeAccountId, runs, savedQuotes, drafts, addressBook }); }, [bookings, notices, users, payment, activeAccountId, runs, savedQuotes, drafts, addressBook]);
  useEffectApp(() => { window.FX.saveInquiries(inquiries); }, [inquiries]);

  // apply theme tweaks
  useEffectApp(() => {
    const r = document.documentElement.style;
    const c = t.brandColor, a = t.accentColor;
    r.setProperty("--brand", c);
    r.setProperty("--brand-700", `color-mix(in srgb, ${c}, black 24%)`);
    r.setProperty("--brand-900", `color-mix(in srgb, ${c}, black 48%)`);
    r.setProperty("--brand-soft", `color-mix(in srgb, ${c}, white 90%)`);
    r.setProperty("--accent", a);
    r.setProperty("--accent-600", `color-mix(in srgb, ${a}, black 12%)`);
    r.setProperty("--accent-700", `color-mix(in srgb, ${a}, black 24%)`);
    r.setProperty("--accent-soft", `color-mix(in srgb, ${a}, white 88%)`);
    r.setProperty("--shadow-cta", `0 8px 22px color-mix(in srgb, ${a}, transparent 70%)`);
  }, [t.brandColor, t.accentColor]);

  useEffectApp(() => {
    const onResize = () => setNarrow(window.innerWidth < 940);
    window.addEventListener("resize", onResize);
    return () => window.removeEventListener("resize", onResize);
  }, []);

  function nav(p, pl = null) { setPage(p); setPayload(pl); setDrawer(false); setAcctMenu(false); window.scrollTo({ top: 0 }); }
  function onPlaced(b) { setBookings(prev => [b, ...prev]); }
  function onPublish(n) { setNotices(prev => [n, ...prev]); }
  function addUser(u) { setUsers(prev => [...prev, u]); }
  function removeUser(id) { setUsers(prev => prev.filter(u => u.id !== id)); }
  function addCard(c) { setPayment(prev => c.primary ? [...prev.map(p => ({ ...p, primary: false })), c] : [...prev, c]); }
  function removeCard(id) { setPayment(prev => prev.filter(p => p.id !== id)); }
  function setPrimaryCard(id) { setPayment(prev => prev.map(p => ({ ...p, primary: p.id === id }))); }
  function onCreateRun(r) { setRuns(prev => [r, ...prev]); setPage("manageRuns"); window.scrollTo({ top: 0 }); }
  function addSavedQuote(q) { setSavedQuotes(prev => [q, ...prev.filter(x => x.no !== q.no)]); }
  function reopenQuote(q) { nav("book", { fromQuote: q }); }
  function saveDraft(d) { setDrafts(prev => [d, ...prev.filter(x => x.id !== d.id)]); }
  function deleteDraft(id) { setDrafts(prev => prev.filter(x => x.id !== id)); }
  function saveAddress(a) { setAddressBook(prev => prev.some(x => x.id === a.id) ? prev.map(x => x.id === a.id ? a : x) : [a, ...prev]); }
  function removeAddress(id) { setAddressBook(prev => prev.filter(x => x.id !== id)); }
  function lodgeInquiry({ shipment, type, message }) {
    const now = new Date().toISOString();
    const inq = { ref: window.FX.genInquiryRef(), tracking: shipment ? shipment.id : "General inquiry", product: "", customerId: activeAccount.id, customerName: window.FX.COMPANY, customerEmail: "dispatch@meridiangroup.com.au", type, message, status: "in-progress", createdAt: now, updatedAt: now, comments: [], rating: null, agent: null };
    setInquiries(prev => [inq, ...prev]);
    return inq;
  }
  function rateInquiry(ref, n) { setInquiries(prev => prev.map(i => i.ref === ref ? { ...i, rating: n } : i)); }

  const cur = t.currency, rateMult = t.rateMult;

  const sidebarBg = t.darkSidebar ? "var(--brand)" : "var(--surface)";
  const onDark = t.darkSidebar;

  const Sidebar = (
    <aside style={{
      width: "var(--sidebar-w)", flex: "none", background: sidebarBg, color: onDark ? "#fff" : "var(--fg-strong)",
      borderRight: onDark ? "none" : "1px solid var(--border)", display: "flex", flexDirection: "column",
      position: narrow ? "fixed" : "sticky", top: 0, height: "100vh", zIndex: 150,
      transform: narrow ? (drawer ? "translateX(0)" : "translateX(-100%)") : "none",
      transition: "transform 240ms cubic-bezier(0.2,0.8,0.2,1)", boxShadow: narrow && drawer ? "var(--shadow-pop)" : "none",
    }}>
      <div style={{ padding: "22px 22px 18px", display: "flex", alignItems: "center", justifyContent: "space-between" }}>
        <button onClick={() => nav("dashboard")} style={{ background: "transparent", border: "none", padding: 0, display: "flex", alignItems: "center", gap: 0 }}>
          <Wordmark size={24} onDark={onDark} />
        </button>
        {narrow && <button onClick={() => setDrawer(false)} style={{ background: "transparent", border: "none", color: onDark ? "rgba(255,255,255,0.7)" : "var(--fg-mute)" }}><Icon name="x" size={20} /></button>}
      </div>

      {/* account switcher */}
      <div style={{ position: "relative", margin: "0 14px 14px" }}>
        <button onClick={() => setAcctMenu(m => !m)} style={{ width: "100%", padding: "11px 13px", borderRadius: "var(--r-md)", background: onDark ? "rgba(255,255,255,0.08)" : "var(--bg-mist)", display: "flex", alignItems: "center", gap: 10, border: "none", textAlign: "left", cursor: "pointer" }}>
          <span style={{ width: 34, height: 34, borderRadius: 9, background: "var(--accent)", color: "#fff", display: "inline-flex", alignItems: "center", justifyContent: "center", fontWeight: 800, fontSize: 14, flex: "none" }}>MG</span>
          <div style={{ minWidth: 0, flex: 1 }}>
            <div style={{ fontSize: 13.5, fontWeight: 600, color: onDark ? "#fff" : "var(--fg-strong)", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}>{activeAccount.name}</div>
            <div style={{ fontFamily: "var(--font-mono)", fontSize: 11, color: onDark ? "rgba(255,255,255,0.55)" : "var(--fg-mute)" }}>{activeAccount.number}</div>
          </div>
          <Icon name="chevrons-up-down" size={16} color={onDark ? "rgba(255,255,255,0.6)" : "var(--fg-mute)"} />
        </button>
        {acctMenu && (
          <div className="fade-in" style={{ position: "absolute", top: "calc(100% + 6px)", left: 0, right: 0, background: "var(--surface)", borderRadius: "var(--r-md)", boxShadow: "var(--shadow-pop)", border: "1px solid var(--border)", padding: 6, zIndex: 200 }}>
            <div style={{ fontFamily: "var(--font-mono)", fontSize: 10, letterSpacing: "1px", textTransform: "uppercase", color: "var(--fg-faint)", padding: "8px 10px 6px" }}>Switch account</div>
            {window.FX.ACCOUNTS.map(a => {
              const sel = a.id === activeAccountId;
              return (
                <button key={a.id} onClick={() => { setActiveAccountId(a.id); setAcctMenu(false); }} style={{ display: "flex", alignItems: "center", gap: 10, width: "100%", textAlign: "left", padding: "9px 10px", borderRadius: "var(--r-sm)", border: "none", background: sel ? "var(--brand-soft)" : "transparent", cursor: "pointer" }}
                  onMouseEnter={e => { if (!sel) e.currentTarget.style.background = "var(--bg-mist)"; }} onMouseLeave={e => { if (!sel) e.currentTarget.style.background = "transparent"; }}>
                  <span style={{ width: 30, height: 30, borderRadius: 8, background: sel ? "var(--brand)" : "var(--bg-mist-2)", color: sel ? "#fff" : "var(--fg-mute)", display: "inline-flex", alignItems: "center", justifyContent: "center", flex: "none" }}><Icon name="wallet" size={15} /></span>
                  <span style={{ flex: 1, minWidth: 0 }}>
                    <span style={{ display: "block", fontSize: 13, fontWeight: 600, color: "var(--fg-strong)" }}>{a.name}</span>
                    <span style={{ display: "block", fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--fg-mute)" }}>{a.number}</span>
                  </span>
                  {sel && <Icon name="check" size={15} color="var(--brand)" />}
                </button>
              );
            })}
          </div>
        )}
      </div>

      <nav style={{ flex: 1, overflowY: "auto", padding: "4px 12px" }}>
        {NAV.map(grp => (
          <div key={grp.group} style={{ marginBottom: 18 }}>
            <div style={{ fontFamily: "var(--font-mono)", fontSize: 10, letterSpacing: "1.2px", textTransform: "uppercase", color: onDark ? "rgba(255,255,255,0.4)" : "var(--fg-faint)", padding: "0 12px 8px" }}>{grp.group}</div>
            {grp.items.map(it => {
              const active = page === it.id;
              return (
                <button key={it.id} onClick={() => nav(it.id)} style={{
                  display: "flex", alignItems: "center", gap: 11, width: "100%", textAlign: "left",
                  padding: "10px 12px", borderRadius: "var(--r-sm)", border: "none", marginBottom: 2,
                  background: active ? (onDark ? "rgba(255,255,255,0.14)" : "var(--brand-soft)") : "transparent",
                  color: active ? (onDark ? "#fff" : "var(--brand)") : (onDark ? "rgba(255,255,255,0.72)" : "var(--fg-body)"),
                  fontSize: 14, fontWeight: active ? 600 : 500, transition: "all 140ms ease", position: "relative",
                }}
                  onMouseEnter={e => { if (!active) e.currentTarget.style.background = onDark ? "rgba(255,255,255,0.06)" : "var(--bg-mist)"; }}
                  onMouseLeave={e => { if (!active) e.currentTarget.style.background = "transparent"; }}>
                  {active && <span style={{ position: "absolute", left: -12, top: "50%", transform: "translateY(-50%)", width: 3, height: 20, background: "var(--accent)", borderRadius: 3 }} />}
                  <Icon name={it.icon} size={18} stroke={active ? 2.2 : 2} />
                  {it.label}
                </button>
              );
            })}
          </div>
        ))}
      </nav>

      <div style={{ padding: 14, borderTop: onDark ? "1px solid rgba(255,255,255,0.1)" : "1px solid var(--border)" }}>
        <button onClick={() => nav("contact")} style={{ display: "flex", alignItems: "center", gap: 10, width: "100%", textAlign: "left", background: "transparent", border: "none", padding: "8px 10px", borderRadius: "var(--r-sm)", color: onDark ? "rgba(255,255,255,0.7)" : "var(--fg-body)" }}>
          <Icon name="headset" size={17} />
          <div style={{ flex: 1 }}>
            <div style={{ fontSize: 12.5, fontWeight: 600 }}>1300 131 150</div>
            <div style={{ fontSize: 11, color: onDark ? "rgba(255,255,255,0.45)" : "var(--fg-mute)" }}>{window.isOpenNow() ? "Open 24/7 · 365" : "Currently closed"}</div>
          </div>
        </button>
        <a href="Fedex CSR Console.html" style={{ display: "flex", alignItems: "center", gap: 10, textDecoration: "none", padding: "8px 10px", marginTop: 4, borderRadius: "var(--r-sm)", color: onDark ? "rgba(255,255,255,0.55)" : "var(--fg-mute)", border: onDark ? "1px dashed rgba(255,255,255,0.18)" : "1px dashed var(--border-strong)" }}
          onMouseEnter={e => { e.currentTarget.style.background = onDark ? "rgba(255,255,255,0.06)" : "var(--bg-mist)"; }}
          onMouseLeave={e => { e.currentTarget.style.background = "transparent"; }}>
          <Icon name="headset" size={16} />
          <div style={{ flex: 1, minWidth: 0 }}>
            <div style={{ fontSize: 12.5, fontWeight: 600 }}>Admin / CSR Console</div>
            <div style={{ fontSize: 10.5, fontFamily: "var(--font-mono)", letterSpacing: "0.5px", textTransform: "uppercase" }}>Demo · staff only</div>
          </div>
          <Icon name="external-link" size={14} />
        </a>
        {session && (
          <button onClick={() => { try { localStorage.removeItem(PORTAL_SESSION_KEY); } catch (e) {} setSession(null); }} style={{ display: "flex", alignItems: "center", gap: 10, width: "100%", textAlign: "left", background: "transparent", border: "none", padding: "8px 10px", marginTop: 4, borderRadius: "var(--r-sm)", color: onDark ? "rgba(255,255,255,0.55)" : "var(--fg-mute)", cursor: "pointer" }}
            onMouseEnter={e => { e.currentTarget.style.background = onDark ? "rgba(255,255,255,0.06)" : "var(--bg-mist)"; }}
            onMouseLeave={e => { e.currentTarget.style.background = "transparent"; }}>
            <Icon name="x" size={15} />
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{ fontSize: 12.5, fontWeight: 600 }}>Sign out</div>
              <div style={{ fontSize: 10.5, whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }}>{session.email}</div>
            </div>
          </button>
        )}
      </div>
    </aside>
  );

  if (!session) {
    return <LoginScreen onLogin={(em) => { const s = { email: em, at: new Date().toISOString() }; try { localStorage.setItem(PORTAL_SESSION_KEY, JSON.stringify(s)); } catch (e) {} setSession(s); }} />;
  }

  return (
    <div style={{ display: "flex", minHeight: "100vh", background: "var(--bg-page)" }}>
      {Sidebar}
      {narrow && drawer && <div onClick={() => setDrawer(false)} style={{ position: "fixed", inset: 0, background: "rgba(30,22,51,0.4)", zIndex: 140 }} />}

      <main style={{ flex: 1, minWidth: 0, display: "flex", flexDirection: "column" }}>
        {/* top bar */}
        <header style={{ height: "var(--topbar-h)", flex: "none", display: "flex", alignItems: "center", justifyContent: "space-between", padding: "0 28px", borderBottom: "1px solid var(--border)", background: "color-mix(in srgb, var(--bg-page), white 40%)", position: "sticky", top: 0, zIndex: 100, backdropFilter: "blur(8px)" }}>
          <div style={{ display: "flex", alignItems: "center", gap: 14 }}>
            {narrow && <button onClick={() => setDrawer(true)} style={{ background: "var(--bg-mist)", border: "none", borderRadius: 9, width: 38, height: 38, display: "inline-flex", alignItems: "center", justifyContent: "center", color: "var(--fg-strong)" }}><Icon name="menu" size={20} /></button>}
            <div style={{ fontSize: 16, fontWeight: 700, color: "var(--fg-strong)" }}>{TITLES[page]}</div>
          </div>
          <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
            <a href="tel:1300131150" style={{ textDecoration: "none" }}>
              <span style={{ display: "inline-flex", alignItems: "center", gap: 7, background: "var(--surface)", border: "1px solid var(--border)", borderRadius: 999, padding: "7px 13px", fontSize: 12.5, color: "var(--fg-body)", fontFamily: "var(--font-mono)" }}>
                <Icon name="phone" size={13} color="var(--brand)" /> 1300 131 150
              </span>
            </a>
            <button style={{ position: "relative", background: "var(--surface)", border: "1px solid var(--border)", borderRadius: "50%", width: 38, height: 38, display: "inline-flex", alignItems: "center", justifyContent: "center", color: "var(--fg-body)" }}>
              <Icon name="bell" size={18} />
              <span style={{ position: "absolute", top: 8, right: 9, width: 7, height: 7, borderRadius: "50%", background: "var(--accent)", border: "1.5px solid var(--surface)" }} />
            </button>
            <span style={{ width: 38, height: 38, borderRadius: "50%", background: "var(--brand)", color: "#fff", display: "inline-flex", alignItems: "center", justifyContent: "center", fontWeight: 700, fontSize: 14 }}>MG</span>
          </div>
        </header>

        <div style={{ padding: narrow ? "24px 20px 64px" : "32px 36px 80px", maxWidth: 1180, width: "100%", margin: "0 auto" }}>
          {page === "dashboard" && <Dashboard bookings={bookings} notices={notices} currency={cur} nav={nav} accountName={window.FX.COMPANY} runs={runs} savedQuotes={savedQuotes} onReopenQuote={reopenQuote} accessLevel={t.accessLevel} />}
          {page === "book" && <Booking key={"book-" + ((payload && payload.resumeDraft && payload.resumeDraft.id) || (payload && payload.fromQuote && payload.fromQuote.no) || "new")} addressBook={addressBook} currency={cur} rateMult={rateMult} onPlaced={onPlaced} nav={nav} accounts={window.FX.ACCOUNTS} activeAccount={activeAccount} seedQuote={payload} drafts={drafts} onSaveDraft={saveDraft} onDeleteDraft={deleteDraft} />}
          {page === "quote" && <Quote currency={cur} rateMult={rateMult} nav={nav} onSaveQuote={addSavedQuote} account={activeAccount} />}
          {page === "createRun" && <CreateRun addressBook={addressBook} onCreate={onCreateRun} nav={nav} />}
          {page === "manageRuns" && <ManageRuns runs={runs} onNew={() => nav("createRun")} />}
          {page === "history" && <History bookings={bookings} currency={cur} nav={nav} onLodgeInquiry={lodgeInquiry} />}
          {page === "addresses" && <AddressBookPage addressBook={addressBook} onSave={saveAddress} onRemove={removeAddress} nav={nav} />}
          {page === "inquiries" && <CustomerInquiries inquiries={inquiries} onRate={rateInquiry} nav={nav} />}
          {page === "depots" && <Depots />}
          {page === "invoices" && <Invoices currency={cur} account={activeAccount} />}
          {page === "payment" && <PaymentMethods methods={payment} onAdd={addCard} onRemove={removeCard} onSetPrimary={setPrimaryCard} />}
          {page === "users" && <Users users={users} onAdd={addUser} onRemove={removeUser} />}
          {page === "contact" && <Contact onLodgeInquiry={lodgeInquiry} />}
        </div>
      </main>

      {/* Tweaks */}
      <TweaksPanel title="Tweaks">
        <TweakSection label="Brand colours" />
        <TweakColor label="Primary" value={t.brandColor}
          options={["#4D148C", "#2A1A6B", "#0C1A2C", "#1F4E79", "#7A1F6B"]}
          onChange={v => setTweak("brandColor", v)} />
        <TweakColor label="Accent" value={t.accentColor}
          options={["#FF6600", "#FF8A00", "#E5484D", "#1A8FF0", "#22B86E"]}
          onChange={v => setTweak("accentColor", v)} />
        <TweakToggle label="Dark sidebar" value={t.darkSidebar} onChange={v => setTweak("darkSidebar", v)} />
        <TweakSection label="Pricing" />
        <TweakSelect label="Currency" value={t.currency} options={["AUD", "NZD", "USD"]} onChange={v => setTweak("currency", v)} />
        <TweakSlider label="Rate multiplier" value={t.rateMult} min={0.7} max={1.6} step={0.05} unit="×" onChange={v => setTweak("rateMult", v)} />
        <TweakSection label="Homepage" />
        <TweakSelect label="Access level" value={t.accessLevel} options={["manager", "clerk"]} onChange={v => setTweak("accessLevel", v)} />
      </TweaksPanel>
    </div>
  );
}

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