/* ============================================================
   screen_dashboard.jsx — главный экран (M2)
   ============================================================ */
function Dashboard({ ctx }) {
  const { activeSite, setActiveSite, setRoute } = ctx;
  const sites = activeSite === "all" ? DATA.sites : DATA.sites.filter(s => s.id === activeSite);
  const [doneTasks, setDoneTasks] = React.useState({});

  const avgHealth = Math.round(sites.reduce((a, s) => a + s.health, 0) / sites.length);
  const totalTop10 = sites.reduce((a, s) => a + s.keysTop10, 0);
  const deltaTop10 = sites.reduce((a, s) => a + s.keysDelta, 0);
  const totalCritical = sites.reduce((a, s) => a + s.critical, 0);
  const alerts = activeSite === "all" ? DATA.alerts : DATA.alerts.filter(a => a.site === activeSite);
  const today = activeSite === "all" ? DATA.todayTasks : DATA.todayTasks.filter(t => t.site === activeSite);

  const siteOf = id => DATA.sites.find(s => s.id === id);
  const greeting = (() => { const h = new Date().getHours(); return h < 6 ? "Доброй ночи" : h < 12 ? "Доброе утро" : h < 18 ? "Добрый день" : "Добрый вечер"; })();

  return (
    <div className="grid" style={{ gap: 18 }}>
      {/* greeting strip */}
      <div style={{ display: "flex", alignItems: "center", gap: 12, marginTop: -6, marginBottom: -2 }}>
        <div style={{ fontSize: 14, color: "var(--ink-2)", fontWeight: 600 }}>
          {greeting}! {totalCritical > 0
            ? <>Сегодня <b style={{ color: "var(--red-ink)" }}>{totalCritical} критич. {plural(totalCritical, "проблема","проблемы","проблем")}</b> требуют внимания.</>
            : <>Всё под контролем — критичных проблем нет.</>}
        </div>
      </div>

      {/* metric cards */}
      <div style={{ display: "grid", gridTemplateColumns: "repeat(4, 1fr)", gap: 16 }}>
        <MetricCard>
          <div style={{ display: "flex", alignItems: "center", gap: 16 }}>
            <Ring value={avgHealth} size={78} stroke={8} />
            <div>
              <div className="metric-label">Средний Health Score</div>
              <div style={{ fontSize: 12.5, color: "var(--ink-3)", marginTop: 6, display: "flex", alignItems: "center", gap: 5 }}>
                по {sites.length} {plural(sites.length, "сайту","сайтам","сайтам")}
                <Help>Сводная оценка технического здоровья сайтов от 0 до 100. Складывается из ошибок аудита, скорости и индексации.</Help>
              </div>
            </div>
          </div>
        </MetricCard>

        <MetricCard onClick={() => setRoute("positions")}>
          <div className="metric-label">Ключей в топ-10</div>
          <div style={{ display: "flex", alignItems: "baseline", gap: 10, marginTop: 8 }}>
            <span className="metric-num tnum">{totalTop10}</span>
            <Delta value={deltaTop10} suffix=" за нед." />
          </div>
          <div style={{ marginTop: 14 }}><Sparkline data={[totalTop10-9,totalTop10-7,totalTop10-8,totalTop10-4,totalTop10-3,totalTop10-1,totalTop10]} width={150} height={28} color="var(--green)" /></div>
        </MetricCard>

        <MetricCard onClick={() => setRoute("audit")}>
          <div className="metric-label">Критичных ошибок</div>
          <div style={{ display: "flex", alignItems: "baseline", gap: 10, marginTop: 8 }}>
            <span className="metric-num tnum" style={{ color: totalCritical ? "var(--red-ink)" : "var(--green-ink)" }}>{totalCritical}</span>
            <Delta value={-2} suffix=" за нед." invert />
          </div>
          <div style={{ marginTop: 14, display: "flex", gap: 6 }}>
            <span className="badge b-red">{totalCritical} критич.</span>
            <span className="badge b-orange">{sites.reduce((a,s)=>a+s.openTasks,0)-totalCritical} важных</span>
          </div>
        </MetricCard>

        <MetricCard onClick={() => setRoute("content")}>
          <div className="metric-label">Статей за июнь</div>
          <div style={{ display: "flex", alignItems: "baseline", gap: 10, marginTop: 8 }}>
            <span className="metric-num tnum">8</span>
            <Delta value={3} suffix=" к маю" />
          </div>
          <div style={{ marginTop: 14, display: "flex", gap: 6 }}>
            <span className="badge b-green">5 опубл.</span>
            <span className="badge b-gray">3 черновика</span>
          </div>
        </MetricCard>
      </div>

      {/* two-column: alerts + today */}
      <div style={{ display: "grid", gridTemplateColumns: "1.35fr 1fr", gap: 18 }}>
        {/* Требует внимания */}
        <div className="card">
          <div className="card-head">
            <span className="badge b-red"><Icon name="alert_triangle" size={12} />Требует внимания</span>
            <h3 style={{ marginLeft: 2 }}>{alerts.length} {plural(alerts.length, "алерт","алерта","алертов")}</h3>
            <div className="spacer" />
            <button className="btn btn-ghost btn-sm">Все события</button>
          </div>
          <div>
            {alerts.map(a => <AlertRow key={a.id} a={a} site={siteOf(a.site)} showSite={activeSite === "all"} setRoute={setRoute} />)}
            {alerts.length === 0 && <div style={{ padding: "30px 18px", textAlign: "center", color: "var(--ink-3)", fontSize: 13.5 }}>Нет активных алертов по этому сайту 🎉</div>}
          </div>
        </div>

        {/* Что делать сегодня */}
        <div className="card">
          <div className="card-head">
            <Icon name="zap" size={16} style={{ color: "var(--accent)" }} />
            <h3>Что делать сегодня</h3>
            <div className="spacer" />
            <span style={{ fontSize: 12, color: "var(--ink-4)", fontWeight: 700 }} className="tnum">{Object.values(doneTasks).filter(Boolean).length}/{today.length}</span>
          </div>
          <div style={{ padding: "6px 0" }}>
            {today.map(t => {
              const m = severityMeta[t.sev]; const done = doneTasks[t.id];
              return (
                <div key={t.id} style={{ display: "flex", alignItems: "center", gap: 11, padding: "10px 16px", opacity: done ? .5 : 1 }}>
                  <Cbx on={done} onClick={() => setDoneTasks(d => ({ ...d, [t.id]: !d[t.id] }))} />
                  <span className="dot" style={{ background: m.color }} />
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ fontSize: 13, fontWeight: 600, textDecoration: done ? "line-through" : "none", lineHeight: 1.3 }}>{t.title}</div>
                    <div style={{ fontSize: 11.5, color: "var(--ink-4)", marginTop: 2, fontWeight: 600 }}>{siteOf(t.site).title} · {t.est}</div>
                  </div>
                </div>
              );
            })}
          </div>
          <div style={{ padding: "10px 16px", borderTop: "1px solid var(--border)" }}>
            <button className="btn btn-soft btn-block btn-sm" onClick={() => setRoute("tasks")}>Открыть все задачи<Icon name="arrow_right" size={14} /></button>
          </div>
        </div>
      </div>

      {/* positions chart */}
      <div className="card">
        <div className="card-head">
          <Icon name="trending" size={16} style={{ color: "var(--accent)" }} />
          <h3>Динамика позиций — 30 дней</h3>
          <div className="spacer" />
          <Legend items={[{ c: "var(--accent)", l: "Google" }, { c: "var(--green)", l: "Яндекс" }]} />
          <span style={{ fontSize: 11.5, color: "var(--ink-4)", fontWeight: 600, marginLeft: 12, display: "flex", alignItems: "center", gap: 4 }}>⌁ апдейты Google</span>
        </div>
        <div className="card-pad">
          <LineChart series={[
            { name: "Google", data: DATA.googleHistory, color: "var(--accent)" },
            { name: "Яндекс", data: DATA.yandexHistory, color: "var(--green)" },
          ]} updates={DATA.googleUpdates} height={200} />
        </div>
      </div>

      {/* sites grid */}
      <div>
        <div style={{ display: "flex", alignItems: "center", marginBottom: 12 }}>
          <h2 className="section-title" style={{ margin: 0 }}>Сайты клиентов</h2>
          <div className="spacer" style={{ flex: 1 }} />
          <button className="btn btn-ghost btn-sm" onClick={() => setRoute("clients")}><Icon name="plus" size={14} />Добавить сайт</button>
        </div>
        <div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 16 }}>
          {DATA.sites.map(s => <SiteCard key={s.id} s={s} onOpen={() => { setActiveSite(s.id); setRoute("audit"); }} />)}
        </div>
      </div>
    </div>
  );
}

function MetricCard({ children, onClick }) {
  return (
    <div className="card card-pad" style={{ cursor: onClick ? "pointer" : "default", transition: "box-shadow .14s, transform .14s" }}
      onClick={onClick}
      onMouseEnter={e => onClick && (e.currentTarget.style.boxShadow = "var(--sh-3)")}
      onMouseLeave={e => onClick && (e.currentTarget.style.boxShadow = "var(--sh-1)")}>
      {children}
    </div>
  );
}

function Legend({ items }) {
  return (
    <div style={{ display: "flex", gap: 14 }}>
      {items.map((it, i) => (
        <span key={i} style={{ display: "flex", alignItems: "center", gap: 6, fontSize: 12, fontWeight: 700, color: "var(--ink-2)" }}>
          <span style={{ width: 14, height: 3, borderRadius: 2, background: it.c }} />{it.l}
        </span>
      ))}
    </div>
  );
}

function AlertRow({ a, site, showSite, setRoute }) {
  const m = severityMeta[a.sev];
  const [open, setOpen] = React.useState(false);
  return (
    <div style={{ borderBottom: "1px solid var(--border)" }}>
      <div style={{ display: "flex", alignItems: "flex-start", gap: 12, padding: "13px 18px", cursor: "pointer" }} onClick={() => setOpen(o => !o)}>
        <div className="prio-bar" style={{ background: m.color, minHeight: 36 }} />
        <span style={{ width: 28, height: 28, borderRadius: 8, background: `color-mix(in srgb, ${m.color} 12%, white)`, color: m.color, display: "flex", alignItems: "center", justifyContent: "center", flex: "0 0 28px", marginTop: 1 }}>
          <Icon name={a.icon} size={15} />
        </span>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div style={{ fontSize: 13.5, fontWeight: 600, lineHeight: 1.35, color: "var(--ink)" }}>{a.text}</div>
          <div style={{ display: "flex", alignItems: "center", gap: 8, marginTop: 5 }}>
            {showSite && <span style={{ display: "inline-flex", alignItems: "center", gap: 5, fontSize: 11.5, fontWeight: 700, color: "var(--ink-3)" }}><Favicon site={site} size={15} radius={4} />{site.title}</span>}
            <span style={{ fontSize: 11.5, color: "var(--ink-4)", fontWeight: 600 }}>{a.time}</span>
          </div>
          {open && (
            <div style={{ marginTop: 10, fontSize: 12.5, color: "var(--ink-2)", lineHeight: 1.5, background: "var(--bg-sunken)", padding: "10px 12px", borderRadius: 9 }}>{a.detail}</div>
          )}
        </div>
        <button className="btn btn-soft btn-sm" onClick={(e) => { e.stopPropagation(); setRoute(a.sev === "critical" || a.action.includes("задач") ? "tasks" : "audit"); }} style={{ flex: "0 0 auto" }}>{a.action}</button>
      </div>
    </div>
  );
}

function SiteCard({ s, onOpen }) {
  const statusBadge = { active: null, redesign: <span className="badge b-violet">на редизайне</span>, new: <span className="badge b-blue">новый</span> }[s.status];
  return (
    <div className="card card-pad" style={{ cursor: "pointer", transition: "box-shadow .14s, transform .14s" }} onClick={onOpen}
      onMouseEnter={e => { e.currentTarget.style.boxShadow = "var(--sh-3)"; e.currentTarget.style.transform = "translateY(-2px)"; }}
      onMouseLeave={e => { e.currentTarget.style.boxShadow = "var(--sh-1)"; e.currentTarget.style.transform = "none"; }}>
      <div style={{ display: "flex", alignItems: "center", gap: 11 }}>
        <Favicon site={s} size={36} radius={9} />
        <div style={{ flex: 1, minWidth: 0 }}>
          <div style={{ fontSize: 14, fontWeight: 800, letterSpacing: "-.01em" }}>{s.title}</div>
          <div style={{ fontSize: 12, color: "var(--ink-4)", fontWeight: 600 }}>{s.domain}</div>
        </div>
        <Ring value={s.health} size={46} stroke={5} />
      </div>
      <div style={{ display: "flex", alignItems: "center", gap: 8, marginTop: 14, marginBottom: 12, minHeight: 22 }}>
        {statusBadge}
        <span style={{ fontSize: 11.5, color: "var(--ink-3)", fontWeight: 600 }}>{s.business}</span>
      </div>
      <div style={{ display: "flex", alignItems: "flex-end", justifyContent: "space-between", gap: 10 }}>
        <div>
          <div style={{ fontSize: 11, color: "var(--ink-4)", fontWeight: 700, textTransform: "uppercase", letterSpacing: ".04em" }}>топ-10</div>
          <div style={{ display: "flex", alignItems: "baseline", gap: 6 }}>
            <span className="tnum" style={{ fontSize: 19, fontWeight: 800 }}>{s.keysTop10}</span>
            <Delta value={s.keysDelta} />
          </div>
        </div>
        <div style={{ flex: 1 }}><Sparkline data={s.spark} width={90} height={30} /></div>
        <div style={{ textAlign: "right" }}>
          <div style={{ fontSize: 11, color: "var(--ink-4)", fontWeight: 700, textTransform: "uppercase", letterSpacing: ".04em" }}>задач</div>
          <div style={{ display: "flex", alignItems: "center", gap: 5, justifyContent: "flex-end" }}>
            {s.critical > 0 && <span className="dot d-red" />}
            <span className="tnum" style={{ fontSize: 19, fontWeight: 800 }}>{s.openTasks}</span>
          </div>
        </div>
      </div>
    </div>
  );
}

function plural(n, one, few, many) {
  const m10 = n % 10, m100 = n % 100;
  if (m10 === 1 && m100 !== 11) return one;
  if (m10 >= 2 && m10 <= 4 && (m100 < 10 || m100 >= 20)) return few;
  return many;
}

window.Dashboard = Dashboard;
window.plural = plural;
