function SettingsPage({ onSignOut, theme, onTheme, lang, onLang, userName = "Менеджер" }) {
  const Row = ({ icon, label, sub, right, danger, onClick, last }) => (
    <button onClick={onClick} disabled={!onClick} style={{
      width: "100%", display: "flex", alignItems: "center", gap: 14, padding: "14px 16px",
      border: 0, background: "transparent", textAlign: "left", cursor: onClick ? "pointer" : "default",
      borderBottom: last ? "none" : "1px solid var(--border-subtle)", fontFamily: "inherit",
      transition: "background 120ms",
    }}
      onMouseEnter={e => { if (onClick) e.currentTarget.style.background = "var(--bg-hover)"; }}
      onMouseLeave={e => e.currentTarget.style.background = "transparent"}>
      <div style={{ width: 30, height: 30, borderRadius: 8, background: danger ? "rgba(244,63,94,.14)" : "var(--bg-raised)", display: "flex", alignItems: "center", justifyContent: "center", color: danger ? "var(--danger)" : "var(--fg-secondary)", flexShrink: 0 }}>
        <Icon name={icon} size={15}/>
      </div>
      <div style={{ flex: 1 }}>
        <div style={{ fontSize: 14, color: danger ? "var(--danger)" : "var(--fg-primary)" }}>{label}</div>
        {sub && <div style={{ fontSize: 11, color: "var(--fg-muted)", marginTop: 2 }}>{sub}</div>}
      </div>
      {right && <span style={{ fontSize: 12, color: "var(--fg-muted)" }}>{right}</span>}
      {onClick && !right && <Icon name="chevron-right" size={15} style={{ color: "var(--fg-muted)" }}/>}
    </button>
  );

  const Section = ({ title, children }) => (
    <div style={{ marginBottom: 20 }}>
      <div style={{ fontSize: 11, fontWeight: 600, letterSpacing: "0.05em", textTransform: "uppercase", color: "var(--fg-muted)", marginBottom: 8, paddingLeft: 4 }}>{title}</div>
      <div style={{ background: "var(--bg-panel)", border: "1px solid var(--border-subtle)", borderRadius: 12, overflow: "hidden" }}>
        {children}
      </div>
    </div>
  );

  const SegmentRow = ({ icon, label, options, value, onChange, last }) => (
    <div style={{ display: "flex", alignItems: "center", gap: 14, padding: "14px 16px", borderBottom: last ? "none" : "1px solid var(--border-subtle)" }}>
      <div style={{ width: 30, height: 30, borderRadius: 8, background: "var(--bg-raised)", display: "flex", alignItems: "center", justifyContent: "center", color: "var(--fg-secondary)", flexShrink: 0 }}>
        <Icon name={icon} size={15}/>
      </div>
      <div style={{ flex: 1, fontSize: 14, color: "var(--fg-primary)" }}>{label}</div>
      <div style={{ display: "flex", background: "var(--bg-raised)", borderRadius: 8, border: "1px solid var(--border-default)", padding: 3, gap: 2 }}>
        {options.map(opt => (
          <button key={opt.value} onClick={() => onChange(opt.value)} style={{
            padding: "5px 14px", border: 0, borderRadius: 6, cursor: "pointer", fontFamily: "inherit",
            fontSize: 12, fontWeight: 500,
            background: value === opt.value ? "var(--accent)" : "transparent",
            color: value === opt.value ? "#fff" : "var(--fg-secondary)",
            transition: "all 150ms",
          }}>{opt.label}</button>
        ))}
      </div>
    </div>
  );

  return (
    <div style={{ flex: 1, overflowY: "auto", display: "flex", justifyContent: "center", padding: "24px 24px" }}>
      <div style={{ width: "100%", maxWidth: 580 }}>
        {/* User card */}
        <div style={{ display: "flex", alignItems: "center", gap: 14, padding: "16px", background: "var(--bg-panel)", border: "1px solid var(--border-subtle)", borderRadius: 12, marginBottom: 20 }}>
          <div style={{ width: 44, height: 44, borderRadius: "50%", background: "linear-gradient(135deg, #6366F1, #8B5CF6)", display: "flex", alignItems: "center", justifyContent: "center", fontSize: 16, fontWeight: 600, color: "#fff", flexShrink: 0 }}>М</div>
          <div>
            <div style={{ fontSize: 14, fontWeight: 500, color: "var(--fg-primary)" }}>{userName}</div>
            <div style={{ fontSize: 12, color: "var(--fg-muted)" }}>Digitalshop CRM</div>
          </div>
        </div>

        <Section title="Загальні">
          <SegmentRow icon="palette" label="Тема" value={theme} onChange={onTheme}
            options={[{ value: "dark", label: "Темна" }, { value: "light", label: "Світла" }]}/>
          <SegmentRow icon="globe" label="Мова" value={lang} onChange={onLang}
            options={[{ value: "uk", label: "Укр" }, { value: "ru", label: "Рус" }]} last/>
        </Section>

        <Section title="Інтеграції">
          <Row icon="send" label="Telegram-бот" sub="@digitalshop_orders_bot" right="Активно"/>
          <Row icon="wallet" label="Банківські рахунки" sub="Підключити банки для балансу" onClick={() => {}}/>
          <Row icon="phone" label="GSM-шлюз" sub="Для запису дзвінків" onClick={() => {}} last/>
        </Section>

        <Section title="Застосунок">
          <Row icon="info" label="Версія" right="1.0.0"/>
          <Row icon="monitor" label="API домен" sub={window.location.hostname || "localhost"} last/>
        </Section>

        <Section title="Акаунт">
          <Row icon="log-out" label="Вийти" danger onClick={onSignOut} last/>
        </Section>
      </div>
    </div>
  );
}

// ── Root app ───────────────────────────────────────────────────────
const { useState, useEffect, useCallback } = React;

function useIsMobile() {
  const [mobile, setMobile] = useState(window.innerWidth <= 768);
  useEffect(() => {
    const fn = () => setMobile(window.innerWidth <= 768);
    window.addEventListener("resize", fn);
    return () => window.removeEventListener("resize", fn);
  }, []);
  return mobile;
}

function useToast() {
  const [toasts, setToasts] = useState([]);
  const show = useCallback((message, type = "success") => {
    const id = Date.now();
    setToasts(ts => [...ts, { id, message, type }]);
    setTimeout(() => setToasts(ts => ts.filter(t => t.id !== id)), 3000);
  }, []);
  return [toasts, show];
}

function App() {
  const [authed, setAuthed]         = useState(() => localStorage.getItem("crm_auth") === "1");
  const [userName, setUserName]     = useState(() => localStorage.getItem("crm_user_name") || "Менеджер");
  const [userRole, setUserRole]     = useState(() => localStorage.getItem("crm_user_role") || "manager");
  const [active, setActive]         = useState("orders");
  const [toasts, showToast]         = useToast();
  const [theme, setTheme]           = useState(() => localStorage.getItem("crm_theme") || "dark");
  const [lang,  setLang]            = useState(() => localStorage.getItem("crm_lang")  || "uk");
  const [incomingCall, setIncoming] = useState(null);
  const isMobile = useIsMobile();

  useEffect(() => {
    document.documentElement.className = theme === "light" ? "light-theme" : "";
    localStorage.setItem("crm_theme", theme);
  }, [theme]);

  useEffect(() => {
    localStorage.setItem("crm_lang", lang);
  }, [lang]);

  // Pre-fetch calls in background as soon as user is authed
  useEffect(() => {
    if (!authed) return;
    if (!window._crmCalls?.data) {
      API.getCalls().then(d => { window._crmCalls = { data: d.calls || [], ts: Date.now() }; }).catch(() => {});
    }
  }, [authed]);

  // WebSocket — incoming call notifications
  useEffect(() => {
    if (!authed) return;
    const proto = location.protocol === "https:" ? "wss" : "ws";
    const ws = new WebSocket(`${proto}://${location.host}`);
    ws.onmessage = (e) => {
      try {
        const msg = JSON.parse(e.data);
        if (msg.event === "incoming_call") setIncoming({ caller: msg.caller, manager: msg.manager || '' });
      } catch {}
    };
    ws.onerror = () => {};
    return () => ws.close();
  }, [authed]);

  const LABELS_MAP = {
    uk: { orders: "Замовлення", requests: "Заявки", calls: "Дзвінки", banking: "Банки", settings: "Налаштування" },
    ru: { orders: "Заказы",     requests: "Заявки", calls: "Звонки",  banking: "Банки", settings: "Настройки"    },
  };
  const L = LABELS_MAP[lang] || LABELS_MAP.uk;

  if (!authed) {
    return <Login onLogin={(name, role) => {
      setUserName(name);
      setUserRole(role || "manager");
      localStorage.setItem("crm_user_role", role || "manager");
      setAuthed(true);
    }}/>;
  }

  const handleSignOut = () => {
    localStorage.removeItem("crm_auth");
    localStorage.removeItem("crm_user_name");
    localStorage.removeItem("crm_user_role");
    setAuthed(false);
  };

  // Track visited tabs — once mounted, keep alive (never unmount)
  const [visited, setVisited] = useState(() => new Set([active]));
  useEffect(() => { setVisited(v => new Set([...v, active])); }, [active]);

  // display:contents → wrapper transparent, children act as direct flex items
  // display:none     → hidden but component stays mounted, all state preserved
  const wrap = (key, el) => (
    <div key={key} style={{ display: active === key ? "contents" : "none" }}>
      {visited.has(key) && el}
    </div>
  );

  const page = (
    <>
      {wrap("orders",   <Orders   isMobile={isMobile} showToast={showToast}/>)}
      {wrap("calls",    <Calls    isMobile={isMobile}/>)}
      {wrap("banking",  <Banking  isMobile={isMobile}/>)}
      {wrap("requests", <Requests isMobile={isMobile} showToast={showToast} userName={userName}/>)}
      {wrap("settings", <SettingsPage onSignOut={handleSignOut} theme={theme} onTheme={setTheme} lang={lang} onLang={setLang} userName={userName}/>)}
    </>
  );

  // ── Mobile ─────────────────────────────────────────────────────
  if (isMobile) {
    return (
      <LangCtx.Provider value={lang}>
        <div style={{ display: "flex", flexDirection: "column", height: "100dvh", width: "100%", overflow: "hidden", position: "relative", background: "var(--bg-base)" }}>
          <MobileTopBar title={L[active]}/>
          <div style={{ flex: 1, display: "flex", flexDirection: "column", overflow: "hidden", position: "relative", paddingBottom: "var(--tabbar-total)" }}>
            {page}
          </div>
          <BottomTabs active={active} onChange={setActive} role={userRole}/>
          <ToastContainer toasts={toasts}/>
          {incomingCall && <IncomingCallPopup caller={incomingCall.caller} manager={incomingCall.manager} onClose={() => setIncoming(null)} onOpenRequests={() => { setActive("requests"); setIncoming(null); }} onOpenOrders={() => { setActive("orders"); setIncoming(null); }} showToast={showToast} userName={userName} isMobile={isMobile}/>}
        </div>
      </LangCtx.Provider>
    );
  }

  // ── Desktop ────────────────────────────────────────────────────
  return (
    <LangCtx.Provider value={lang}>
      <Sidebar active={active} onChange={setActive} userName={userName} role={userRole}/>
      <div className="main">
        <TopBar title={L[active]}/>
        <div style={{ flex: 1, display: "flex", flexDirection: "column", overflow: "hidden" }}>
          {page}
        </div>
      </div>
      <ToastContainer toasts={toasts}/>
      {incomingCall && <IncomingCallPopup caller={incomingCall.caller} manager={incomingCall.manager} onClose={() => setIncoming(null)} onOpenRequests={() => { setActive("requests"); setIncoming(null); }} onOpenOrders={() => { setActive("orders"); setIncoming(null); }} showToast={showToast} userName={userName} isMobile={isMobile}/>}
    </LangCtx.Provider>
  );
}

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