/* ============================================================
   app.jsx — shell (sidebar + topbar + site selector + router)
   ============================================================ */
const { useState, useEffect, useRef, useMemo, useCallback } = React;

// — nav config —
const NAV = [
  { group: "", items: [
    { id: "dashboard", label: "Дашборд", icon: "dashboard" },
    { id: "clients", label: "Клиенты", icon: "users" },
  ]},
  { group: "Исследование", items: [
    { id: "keywords", label: "Ключевые слова", icon: "search" },
    { id: "audit", label: "Аудит сайта", icon: "stethoscope", badge: "site" },
    { id: "onpage", label: "Оптимизация страниц", icon: "wrench" },
    { id: "content", label: "Контент (AI)", icon: "pen" },
    { id: "links", label: "Ссылки", icon: "link" },
    { id: "competitors", label: "Конкуренты", icon: "eye" },
  ]},
  { group: "Мониторинг", items: [
    { id: "positions", label: "Позиции", icon: "trending" },
    { id: "monitoring", label: "Мониторинг изменений", icon: "shield" },
    { id: "migration", label: "Миграция (редизайн)", icon: "truck", badge: "redesign" },
    { id: "aiseo", label: "AI SEO", icon: "bot" },
  ]},
  { group: "Управление", items: [
    { id: "tasks", label: "Задачи", icon: "check_circle", badge: "tasks" },
    { id: "reports", label: "Отчёты", icon: "report" },
  ]},
];

// route -> component name on window
const SCREENS = {
  dashboard: "Dashboard", audit: "Audit", tasks: "Tasks", content: "Content",
  positions: "Positions", migration: "Migration", aiseo: "AISeo", clients: "Onboarding",
  keywords: "Keywords", onpage: "OnPage", links: "Links", competitors: "Competitors",
  monitoring: "Monitoring", reports: "Reports", settings: "Settings",
};

const SCREEN_META = {
  dashboard: { title: "Дашборд", sub: "Обзор всех клиентских сайтов" },
  clients: { title: "Клиенты и сайты", sub: "Управление проектами и подключениями" },
  keywords: { title: "Ключевые слова", sub: "Семантическое ядро и Вордстат" },
  audit: { title: "Аудит сайта", sub: "Технический анализ и здоровье сайта" },
  onpage: { title: "Оптимизация страниц", sub: "On-page анализ отдельной страницы" },
  content: { title: "Контент", sub: "AI-генератор статей и мета-тегов" },
  links: { title: "Ссылки", sub: "Входящие ссылки и доноры" },
  competitors: { title: "Конкуренты", sub: "Сравнение и анализ соперников" },
  positions: { title: "Позиции", sub: "Отслеживание в Google и Яндексе" },
  monitoring: { title: "Мониторинг изменений", sub: "Защита от «тихих катастроф»" },
  migration: { title: "SEO-миграция при редизайне", sub: "Сохранение позиций при переезде" },
  aiseo: { title: "AI SEO", sub: "Видимость в нейросетях" },
  tasks: { title: "Задачи", sub: "План работ по всем сайтам" },
  reports: { title: "Отчёты для клиентов", sub: "Брендированные PDF-отчёты" },
  settings: { title: "Настройки", sub: "Студия, интеграции, команда и тариф" },
};

function useOutside(ref, cb) {
  useEffect(() => {
    function h(e) { if (ref.current && !ref.current.contains(e.target)) cb(); }
    document.addEventListener("mousedown", h);
    return () => document.removeEventListener("mousedown", h);
  }, []);
}

// ===== Sidebar =====
function Sidebar({ route, setRoute, collapsed }) {
  const totalTasks = DATA.tasks.filter(t => t.status !== "done").length;
  const badgeFor = (b) => {
    if (b === "tasks") return totalTasks;
    if (b === "redesign") return DATA.sites.filter(s => s.status === "redesign").length || null;
    return null;
  };
  return (
    <aside className="sidebar">
      <div className="sb-brand">
        <div className="sb-logo">K</div>
        {!collapsed && <div className="sb-wordmark"><b>Kant SEO</b><span>Manager</span></div>}
      </div>
      <nav className="sb-nav">
        {NAV.map((g, gi) => (
          <div key={gi}>
            {g.group && !collapsed && <div className="sb-group-label">{g.group}</div>}
            {g.group && collapsed && <div style={{ height: 1, background: "var(--border)", margin: "10px 8px" }} />}
            {g.items.map(it => {
              const bdg = it.badge ? badgeFor(it.badge) : null;
              return (
                <button key={it.id} className={"sb-item" + (route === it.id ? " active" : "")} onClick={() => setRoute(it.id)} title={collapsed ? it.label : ""}>
                  <Icon name={it.icon} />
                  <span>{it.label}</span>
                  {bdg ? <span className="sb-badge">{bdg}</span> : null}
                </button>
              );
            })}
          </div>
        ))}
      </nav>
    </aside>
  );
}

// ===== Site selector =====
function SiteSelector({ activeSite, setActiveSite, allowAll, route }) {
  const [open, setOpen] = useState(false);
  const ref = useRef();
  useOutside(ref, () => setOpen(false));
  const isAll = activeSite === "all";
  const site = DATA.sites.find(s => s.id === activeSite);
  return (
    <div style={{ position: "relative" }} ref={ref}>
      <button className="site-sel" onClick={() => setOpen(o => !o)}>
        {isAll ? (
          <span className="site-favicon" style={{ background: "linear-gradient(140deg,#3a3a3a,#1a1a1a)" }}><Icon name="layers" size={13} /></span>
        ) : <Favicon site={site} />}
        <span>{isAll ? "Все сайты" : site.title}</span>
        {!isAll && <span style={{ color: "var(--ink-4)", fontWeight: 600, fontSize: 12.5 }}>{site.domain}</span>}
        <span className="chev"><Icon name="chevron_down" /></span>
      </button>
      {open && (
        <div className="menu" style={{ top: "calc(100% + 6px)", left: 0 }}>
          {allowAll && (
            <button className={"menu-item" + (isAll ? " sel" : "")} onClick={() => { setActiveSite("all"); setOpen(false); }}>
              <span className="site-favicon" style={{ background: "linear-gradient(140deg,#3a3a3a,#1a1a1a)" }}><Icon name="layers" size={13} /></span>
              <span>Все сайты</span>
              <span style={{ marginLeft: "auto", fontSize: 11.5, color: "var(--ink-4)", fontWeight: 700 }}>{DATA.sites.length}</span>
            </button>
          )}
          <div className="menu-label">Сайты клиентов</div>
          {DATA.sites.map(s => (
            <button key={s.id} className={"menu-item" + (activeSite === s.id ? " sel" : "")} onClick={() => { setActiveSite(s.id); setOpen(false); }}>
              <Favicon site={s} />
              <span style={{ display: "flex", flexDirection: "column", lineHeight: 1.25 }}>
                <span style={{ fontWeight: 700 }}>{s.title}</span>
                <span style={{ fontSize: 11.5, color: "var(--ink-4)", fontWeight: 600 }}>{s.domain}</span>
              </span>
              {s.status === "redesign" && <span className="badge b-violet" style={{ marginLeft: "auto" }}>редизайн</span>}
              {s.critical > 0 && s.status !== "redesign" && <span className="dot d-red" style={{ marginLeft: "auto" }} />}
            </button>
          ))}
          <div className="menu-sep" />
          <button className="menu-item"><Icon name="plus" size={16} /><span>Добавить сайт</span></button>
        </div>
      )}
    </div>
  );
}

// ===== Account menu =====
function AccountMenu({ setRoute }) {
  const [open, setOpen] = useState(false);
  const ref = useRef();
  useOutside(ref, () => setOpen(false));
  return (
    <div style={{ position: "relative" }} ref={ref}>
      <button className="tb-avatar" onClick={() => setOpen(o => !o)} style={{ border: "none", cursor: "pointer" }}>KS</button>
      {open && (
        <div className="menu" style={{ top: "calc(100% + 8px)", right: 0, width: 240 }}>
          <div style={{ display: "flex", alignItems: "center", gap: 11, padding: "8px 10px 12px" }}>
            <span style={{ width: 40, height: 40, borderRadius: 999, background: "linear-gradient(140deg,#2c6db0,#0f4c8a)", color: "#fff", fontWeight: 700, fontSize: 14, display: "flex", alignItems: "center", justifyContent: "center", flex: "0 0 40px" }}>КС</span>
            <div><div style={{ fontSize: 13.5, fontWeight: 800 }}>Кирилл Соколов</div><div style={{ fontSize: 11.5, color: "var(--ink-4)", fontWeight: 600 }}>Kant Studio · владелец</div></div>
          </div>
          <div className="menu-sep" />
          <button className="menu-item" onClick={() => { setRoute("settings"); setOpen(false); }}><Icon name="settings" size={16} /><span>Настройки</span></button>
          <button className="menu-item" onClick={() => { setRoute("settings"); setOpen(false); }}><Icon name="users" size={16} /><span>Команда студии</span></button>
          <button className="menu-item" onClick={() => { setRoute("settings"); setOpen(false); }}><Icon name="award" size={16} /><span>Тариф и оплата</span></button>
          <div className="menu-sep" />
          <button className="menu-item" style={{ color: "var(--red-ink)" }}><Icon name="external" size={16} /><span>Выйти</span></button>
        </div>
      )}
    </div>
  );
}

// ===== Notifications =====
function NotifMenu() {
  const [open, setOpen] = useState(false);
  const ref = useRef();
  useOutside(ref, () => setOpen(false));
  return (
    <div style={{ position: "relative" }} ref={ref}>
      <button className="tb-icon-btn" onClick={() => setOpen(o => !o)}><Icon name="bell" /><span className="dot" /></button>
      {open && (
        <div className="menu" style={{ top: "calc(100% + 8px)", right: 0, width: 340 }}>
          <div className="menu-label">Уведомления</div>
          {DATA.alerts.slice(0, 4).map(a => {
            const m = severityMeta[a.sev];
            return (
              <div key={a.id} className="menu-item" style={{ alignItems: "flex-start", cursor: "default" }}>
                <span className={"dot " + m.dot} style={{ marginTop: 6 }} />
                <span style={{ display: "flex", flexDirection: "column", gap: 2 }}>
                  <span style={{ fontWeight: 600, fontSize: 12.5, color: "var(--ink)", lineHeight: 1.35 }}>{a.text}</span>
                  <span style={{ fontSize: 11, color: "var(--ink-4)" }}>{a.time}</span>
                </span>
              </div>
            );
          })}
        </div>
      )}
    </div>
  );
}

// ===== Placeholder for not-yet-built screens =====
function Placeholder({ route }) {
  const meta = SCREEN_META[route] || {};
  return (
    <div className="empty" style={{ paddingTop: 90 }}>
      <span className="ic"><Icon name="layers" /></span>
      <h3>{meta.title}</h3>
      <p>Этот раздел использует те же паттерны, что и готовые экраны. В этом прототипе сфокусированы 8 ключевых экранов — выберите их в боковом меню.</p>
    </div>
  );
}

// ===== App =====
function App() {
  const [route, setRoute] = useState(() => localStorage.getItem("kant.route") || "dashboard");
  const [activeSite, setActiveSite] = useState(() => localStorage.getItem("kant.site") || "all");
  const [collapsed, setCollapsed] = useState(false);
  const [aiOpen, setAiOpen] = useState(false);

  useEffect(() => { localStorage.setItem("kant.route", route); }, [route]);
  useEffect(() => { localStorage.setItem("kant.site", activeSite); }, [activeSite]);

  // dashboard & tasks allow "all"; detail screens need a concrete site
  const allowAll = ["dashboard", "tasks", "positions", "reports", "monitoring", "settings", "clients"].includes(route);
  const effSite = (!allowAll && activeSite === "all") ? DATA.sites[0].id : activeSite;
  useEffect(() => {
    if (!allowAll && activeSite === "all") setActiveSite(DATA.sites[0].id);
  }, [route]);

  const meta = SCREEN_META[route] || {};
  const ScreenName = SCREENS[route];
  const Screen = ScreenName ? window[ScreenName] : null;

  const ctx = { site: effSite, activeSite, setActiveSite, setRoute };

  return (
    <div className="winframe">
      <div className="titlebar">
        <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
          <div className="win-dots"><i style={{ background: "#FF5F57" }} /><i style={{ background: "#FEBC2E" }} /><i style={{ background: "#28C840" }} /></div>
        </div>
        <div className="tb-title">Kant SEO Manager — {meta.title}</div>
        <div className="win-ctl"><Icon name="minus" size={13} /><Icon name="panel_left" size={12} /><Icon name="x" size={13} /></div>
      </div>

      <div className={"app" + (collapsed ? " collapsed" : "")}>
        <Sidebar route={route} setRoute={setRoute} collapsed={collapsed} />
        <div className="main">
          <header className="topbar">
            <button className="tb-collapse" onClick={() => setCollapsed(c => !c)} title="Свернуть меню"><Icon name="panel_left" /></button>
            <SiteSelector activeSite={activeSite} setActiveSite={setActiveSite} allowAll={allowAll} route={route} />
            <div className="tb-spacer" />
            <button className="btn btn-soft btn-sm" onClick={() => setAiOpen(true)}><Icon name="sparkles" size={14} />Спросить ИИ</button>
            <NotifMenu />
            <button className={"tb-icon-btn" + (route === "settings" ? " active" : "")} onClick={() => setRoute("settings")} title="Настройки" style={route === "settings" ? { background: "var(--accent-soft)", borderColor: "transparent", color: "var(--accent)" } : null}><Icon name="settings" /></button>
            <AccountMenu setRoute={setRoute} />
          </header>
          <div className="canvas">
            <div className="page route-fade" key={route}>
              <div className="page-head">
                <div>
                  <h1 className="page-title">{meta.title}</h1>
                  <p className="page-sub">{meta.sub}</p>
                </div>
                <div className="spacer" />
              </div>
              {Screen ? <Screen ctx={ctx} /> : <Placeholder route={route} />}
            </div>
          </div>
        </div>
      </div>
      <Assistant open={aiOpen} onClose={() => setAiOpen(false)} setRoute={setRoute} setActiveSite={setActiveSite} />
    </div>
  );
}

window.__mountApp = () => {
  ReactDOM.createRoot(document.getElementById("root")).render(<App />);
};
