/* ============================================================
   assistant.jsx — «Спросить ИИ» — выезжающий чат-помощник
   Контекстные ответы по данным приложения + стриминг
   ============================================================ */
function Assistant({ open, onClose, setRoute, setActiveSite }) {
  const [msgs, setMsgs] = React.useState([
    { role: "ai", text: "Привет! Я помогу разобраться с SEO ваших сайтов простыми словами. Спросите что угодно или выберите подсказку ниже.", done: true },
  ]);
  const [input, setInput] = React.useState("");
  const [busy, setBusy] = React.useState(false);
  const bodyRef = React.useRef(null);
  const streamRef = React.useRef(null);

  React.useEffect(() => {
    if (bodyRef.current) bodyRef.current.scrollTop = bodyRef.current.scrollHeight;
  }, [msgs]);
  React.useEffect(() => () => clearInterval(streamRef.current), []);

  const suggestions = [
    { q: "Что самое срочное сегодня?", route: "tasks" },
    { q: "Почему упали позиции у клиники?", route: "positions", site: "vivamed" },
    { q: "Какие сайты под угрозой?", route: "dashboard" },
    { q: "Что делать с сайтом на редизайне?", route: "migration", site: "stroydom" },
  ];

  function answerFor(q) {
    const s = q.toLowerCase();
    if (s.includes("срочн") || s.includes("сегодня") || s.includes("важн")) {
      return { text: "Самое срочное сейчас — **2 критичные проблемы**:\n\n1. **СтройДом 39** — на 3 страницах раздела «Проекты» стоит noindex. Сайт исчезает из поиска. → исправить за ~10 мин.\n2. **Клиника ВиваМед** — ключ «частная клиника калининград» упал с 4 на 11 позицию.\n\nРекомендую начать с noindex — это быстрее всего и больнее всего бьёт по трафику.", cta: { label: "Открыть задачи", route: "tasks" } };
    }
    if (s.includes("позиц") || s.includes("упал") || s.includes("клиник") || s.includes("вивамед")) {
      return { text: "У **Клиники ВиваМед** ключ «частная клиника калининград» просел с 4 на 11 место в Google.\n\nВероятные причины:\n• Обновление Google от 8 июня (Core Update) — совпадает по дате.\n• Возможно, конкурент усилил свою страницу.\n\nЧто делать: обновить контент целевой страницы (свежесть, экспертность врачей), проверить технические ошибки и нарастить внутренние ссылки на неё.", cta: { label: "Посмотреть позиции", route: "positions", site: "vivamed" } };
    }
    if (s.includes("угроз") || s.includes("риск") || s.includes("проблем")) {
      return { text: "Под наибольшей угрозой — **2 сайта**:\n\n• **СтройДом 39** (Health 44) — на редизайне, 3 критичные ошибки, позиции падают. Нужна аккуратная миграция.\n• **Клиника ВиваМед** (Health 64) — просели позиции после апдейта Google.\n\nОстальные 4 сайта в норме или растут.", cta: { label: "Открыть дашборд", route: "dashboard" } };
    }
    if (s.includes("редизайн") || s.includes("миграц") || s.includes("стройдом") || s.includes("переезд")) {
      return { text: "**СтройДом 39** сейчас на редизайне — это самый рискованный момент для SEO.\n\nГлавное правило: **не потерять накопленные позиции**. Для этого нужно:\n1. Снять снимок старого сайта (уже сделано — 9 URL).\n2. Настроить 301-редиректы со старых адресов на новые.\n3. Пройти чек-лист запуска (noindex, robots, sitemap).\n4. Следить за позициями 30 дней после переезда.\n\nСейчас 2 из 9 редиректов отдают 404 — это надо поправить до запуска.", cta: { label: "Открыть модуль миграции", route: "migration", site: "stroydom" } };
    }
    if (s.includes("контент") || s.includes("стат") || s.includes("текст") || s.includes("напис")) {
      return { text: "Я могу сгенерировать SEO-статью под любой ключ за пару минут: со структурой H2–H3, нужной плотностью ключа и мета-тегами.\n\nСейчас в работе черновик «Как выбрать пластиковые окна» для сайта Окна Кёниг. Хотите дописать его или начать новую статью?", cta: { label: "Открыть генератор", route: "content" } };
    }
    if (s.includes("ссылк") || s.includes("бэклинк")) {
      return { text: "По ссылкам: за неделю появилось **2 новых** (klops.ru, mebel-forum.ru) и **потеряно 2** (auto-portal39.ru удалил страницу).\n\nЧтобы наращивать ссылочную массу бесплатно: каталоги (Яндекс.Бизнес, 2ГИС, Фламп), гостевые статьи в местных СМИ и обмен с дизайнерами интерьеров.", cta: { label: "Открыть раздел ссылок", route: "links" } };
    }
    if (s.includes("нейросет") || s.includes("ai") || s.includes("чатгпт") || s.includes("gpt")) {
      return { text: "По видимости в нейросетях (AI Trust Score = 58/100): **Мебель Балтика** упоминается в ChatGPT и Gemini, но Claude чаще советует конкурентов.\n\nЧтобы это исправить: добавить разметку Schema.org, файл llms.txt и кейсы с конкретными цифрами. Это помогает ИИ «понять» и рекомендовать вас.", cta: { label: "Открыть AI SEO", route: "aiseo" } };
    }
    return { text: "Хороший вопрос! Я ориентируюсь по данным ваших 6 сайтов: позиции, аудит, задачи, ссылки и упоминания в нейросетях.\n\nПопробуйте спросить про срочные задачи, упавшие позиции, риски по сайтам или генерацию контента — отвечу конкретно по вашим проектам.", cta: null };
  }

  function send(text) {
    if (!text.trim() || busy) return;
    const ans = answerFor(text);
    setMsgs(m => [...m, { role: "user", text, done: true }, { role: "ai", text: "", done: false, cta: ans.cta }]);
    setInput(""); setBusy(true);
    let i = 0;
    clearInterval(streamRef.current);
    streamRef.current = setInterval(() => {
      i += Math.floor(2 + Math.random() * 4);
      setMsgs(m => { const c = [...m]; c[c.length - 1] = { ...c[c.length - 1], text: ans.text.slice(0, i) }; return c; });
      if (i >= ans.text.length) {
        clearInterval(streamRef.current);
        setMsgs(m => { const c = [...m]; c[c.length - 1] = { ...c[c.length - 1], text: ans.text, done: true }; return c; });
        setBusy(false);
      }
    }, 18);
  }

  if (!open) return null;
  return (
    <>
      <div className="scrim" onClick={onClose} />
      <aside className="drawer" style={{ width: 440 }}>
        <div className="drawer-head" style={{ gap: 11 }}>
          <span style={{ width: 32, height: 32, borderRadius: 9, background: "linear-gradient(150deg, var(--accent), #1769b8)", color: "#fff", display: "flex", alignItems: "center", justifyContent: "center", flex: "0 0 32px" }}><Icon name="sparkles" size={17} /></span>
          <div style={{ flex: 1 }}>
            <div style={{ fontSize: 14.5, fontWeight: 800, lineHeight: 1.1 }}>SEO-помощник</div>
            <div style={{ fontSize: 11.5, color: "var(--ink-4)", fontWeight: 600 }}>понимает все ваши сайты</div>
          </div>
          <button className="icon-btn" onClick={onClose}><Icon name="x" size={16} /></button>
        </div>

        <div className="drawer-body" ref={bodyRef} style={{ display: "flex", flexDirection: "column", gap: 14, background: "var(--bg)" }}>
          {msgs.map((m, i) => (
            <div key={i} style={{ display: "flex", flexDirection: "column", alignItems: m.role === "user" ? "flex-end" : "flex-start", gap: 8 }}>
              <div style={{ maxWidth: "88%", padding: "11px 14px", borderRadius: 14, fontSize: 13.5, lineHeight: 1.55, fontWeight: m.role === "user" ? 600 : 500,
                background: m.role === "user" ? "var(--accent)" : "var(--surface)", color: m.role === "user" ? "#fff" : "var(--ink)",
                border: m.role === "ai" ? "1px solid var(--border)" : "none", borderBottomRightRadius: m.role === "user" ? 4 : 14, borderBottomLeftRadius: m.role === "ai" ? 4 : 14, boxShadow: m.role === "ai" ? "var(--sh-1)" : "none" }}>
                <span className={!m.done ? "cursor" : ""}><AiText text={m.text} /></span>
              </div>
              {m.done && m.cta && (
                <button className="btn btn-soft btn-sm" onClick={() => { m.cta.site && setActiveSite(m.cta.site); setRoute(m.cta.route); onClose(); }}>
                  {m.cta.label}<Icon name="arrow_right" size={14} />
                </button>
              )}
            </div>
          ))}
        </div>

        <div style={{ padding: "12px 16px 10px", borderTop: "1px solid var(--border)", background: "var(--surface)" }}>
          {msgs.length <= 1 && (
            <div style={{ display: "flex", flexWrap: "wrap", gap: 7, marginBottom: 11 }}>
              {suggestions.map((s, i) => (
                <button key={i} className="chip" onClick={() => send(s.q)} style={{ fontSize: 12 }}>{s.q}</button>
              ))}
            </div>
          )}
          <div style={{ display: "flex", gap: 8, alignItems: "center", border: "1px solid var(--border-strong)", borderRadius: 12, padding: "5px 5px 5px 14px", background: "var(--surface)" }}>
            <input value={input} onChange={e => setInput(e.target.value)} onKeyDown={e => e.key === "Enter" && send(input)}
              placeholder="Спросите про ваши сайты…" style={{ flex: 1, border: "none", outline: "none", fontSize: 13.5, fontWeight: 500, background: "transparent", fontFamily: "inherit" }} />
            <button className="btn btn-primary" onClick={() => send(input)} disabled={busy || !input.trim()} style={{ width: 36, height: 36, padding: 0, borderRadius: 9 }}><Icon name="send" size={16} /></button>
          </div>
        </div>
      </aside>
    </>
  );
}

// tiny **bold** + line-break renderer
function AiText({ text }) {
  return text.split("\n").map((line, i) => (
    <React.Fragment key={i}>
      {i > 0 && <br />}
      {line.split(/(\*\*[^*]+\*\*)/g).map((p, j) => /^\*\*/.test(p) ? <b key={j}>{p.slice(2, -2)}</b> : p)}
    </React.Fragment>
  ));
}

window.Assistant = Assistant;
