/* global React, API, Bubble, DocFrame, EmptyDoc, Msg, AiProg, Btn, now */
// Сценарий 2 — Составление документа через уточняющие вопросы (реальный Claude, промпт «юрист-профи»).
// Флоу: опишите → уточняющие вопросы → ответы → ШАБЛОН (превью справа) → сохранить шаблон (демо)
//       → создать первый документ на его основе (заполнить плейсхолдеры из чата) → Word.

window.SCENARIOS = window.SCENARIOS || {};

const QNA_QUESTIONS_SYSTEM = `Ты — практикующий юрист по договорному праву РФ. Пользователь хочет составить документ с нуля. Определи тип документа и задай 4–6 КРАТКИХ уточняющих вопросов, ответы на которые нужны для составления (стороны и их статус, предмет и объём, цена/НДС, порядок оплаты, сроки, ответственность, особые условия). Верни СТРОГО JSON: {"docType":"название документа","questions":["вопрос 1", ...]}. Русский, без текста вне JSON.`;

const QNA_DRAFT_SYSTEM = `Ты — практикующий юрист-профессионал по договорному праву РФ (10+ лет практики). Составь юридически выверенный, готовый к использованию ШАБЛОН документа на основе типа и ответов пользователя.
ТРЕБОВАНИЯ:
- Полная структура: преамбула и реквизиты сторон; 1. Предмет; 2. Права и обязанности; 3. Цена и порядок расчётов (с НДС/УСН/НПД); 4. Сроки; 5. Ответственность сторон; 6. Форс-мажор; 7. Порядок разрешения споров; 8. Заключительные положения; реквизиты и подписи.
- Формулировки — точные, сбалансированные, исполнимые; деловой юридический русский.
- Это ШАБЛОН для многократного использования: конкретные значения, которых нет в ответах (наименования, ИНН, суммы, даты), оставляй плейсхолдерами вида «____».
- В конце добавь раздел «Нормативная база» со ссылками на конкретные статьи ГК РФ (как Консультант+).
ВЕРНИ ТОЛЬКО готовый текст документа — обычным текстом с нумерованными разделами и переносами строк. БЕЗ JSON, без markdown-разметки, без каких-либо пояснений до или после текста.`;

const QNA_FILL_SYSTEM = `Ты — юрист DataDoc. Заполни плейсхолдеры «____» в шаблоне документа данными пользователя. Данные, которых пользователь не дал, оставь как «____». Не меняй структуру и формулировки шаблона — только подставь значения.
ВЕРНИ ТОЛЬКО финальный текст документа обычным текстом. БЕЗ JSON, без markdown, без пояснений.`;

// ── результат: превью шаблона + сохранить (демо) + создать первый документ ──
function QnaResult({ ctx, draft }) {
  const [stage, setStage] = React.useState('draft'); // draft → saved
  const url = React.useMemo(() => {
    const body = window.mdToHtml(draft.text) + (draft.norms && draft.norms.length ? '<h2>Нормативная база</h2><p>' + draft.norms.map((n) => '• ' + n).join('<br>') + '</p>' : '');
    return URL.createObjectURL(window.makeWordBlob(draft.title, '<h1>' + draft.title + '</h1>' + body));
  }, []);
  const fname = draft.title.replace(/[\\/:*?"<>|]/g, ' ').slice(0, 80) + '.doc';

  const save = () => {
    setStage('saved');
    ctx.you('Сохранить как шаблон');
    ctx.aiNode(
      <Bubble>
        <span style={{ display: 'flex', gap: 8, alignItems: 'center' }}><span style={{ fontSize: 22, color: '#1f6b3a' }}>✓</span>
          <span>Шаблон <b>«{draft.title}»</b> сохранён (демо). В DataDoc его можно разметить переменными и переиспользовать.</span></span>
        <div className="acta">
          <Btn kind="primary" onClick={startFirstDoc}>Создать первый документ по шаблону →</Btn>
        </div>
      </Bubble>
    );
  };

  const startFirstDoc = () => {
    window.__qnaTemplate = { title: draft.title, text: draft.text };
    ctx.you('Создать документ по шаблону');
    ctx.setHead('Документ по шаблону', 'из «' + draft.title + '»');
    ctx.ai('Напишите данные для документа — стороны, ИНН, суммы, сроки (одним сообщением). Подставлю их в шаблон, остальное оставлю как «____».');
    ctx.capture(qnaFill);
  };

  return (
    <>
      <Bubble>Готов <b>шаблон «{draft.title}»</b> — юридически выверенный, с нормативной базой. Полный текст открыт в превью справа. Проверьте и сохраните.</Bubble>
      {stage === 'draft' ? (
        <div className="acta">
          <Btn kind="primary" onClick={save}>Сохранить как шаблон (демо) →</Btn>
          <a className="btn-aip" href={url} download={fname}>Скачать Word</a>
        </div>
      ) : null}
    </>
  );
}

function showDraft(ctx, d) {
  ctx.setDoc(<DocFrame title={d.title} sub="разработанный шаблон · редактируемый"><EditableDoc title={d.title} text={d.text} fileName={d.title} /></DocFrame>);
  ctx.aiNode(<QnaResult ctx={ctx} draft={d} />);
}

async function askQuestions(ctx, need) {
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="❓" label="готовлю вопросы юриста" count="Claude" /></Msg>);
  let q;
  try { q = (await API.claudeJSON(QNA_QUESTIONS_SYSTEM, [{ type: 'text', text: 'Запрос: ' + need }], { max_tokens: 900 })).data; }
  catch (e) { ctx.remove(k); ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Claude вернул ошибку: {e.message}</span></Bubble>); return; }
  ctx.remove(k);
  if (!q || !Array.isArray(q.questions)) { ctx.ai('Не удалось сформулировать вопросы, попробуйте иначе.'); return; }
  window.__qna = { docType: q.docType || need };
  ctx.setHead('Составление документа', q.docType || 'по вопросам');
  ctx.setDoc(<DocFrame title={q.docType || 'документ'} sub="ответьте на вопросы в чате"><EmptyDoc lines={['❓', 'шаблон соберётся здесь\nпосле ваших ответов']} /></DocFrame>);
  ctx.aiNode(
    <>
      <Bubble>Соберу <b>{q.docType || 'документ'}</b> как юрист. Ответьте одним сообщением на вопросы (можно кратко):</Bubble>
      <div className="cpcard">{q.questions.map((qq, i) => <div key={i} className="cprow"><span className="k">{i + 1}</span><span className="v">{qq}</span></div>)}</div>
      <div style={{ fontSize: 11, color: 'var(--ink-3)', marginTop: 6 }}>Что не знаете — пропустите, оставлю «____».</div>
    </>
  );
  window.__qna.questions = q.questions;
  ctx.capture(qnaDraft);
}

async function qnaDraft(ctx, { text }) {
  const st = window.__qna;
  if (!st) { ctx.uncapture(); return ctx.ai('Начните заново: «собери договор по вопросам».'); }
  if (/^(отмена|стоп|выйти)$/i.test((text || '').trim())) { ctx.uncapture(); window.__qna = null; return ctx.ai('Ок, отменила.'); }
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="✍" label="составляю шаблон как юрист" count="Claude" /></Msg>);
  let docText;
  try {
    const resp = await API.claude([{ role: 'user', content: `Тип документа: ${st.docType}\nВопросы: ${JSON.stringify(st.questions)}\nОтветы пользователя: ${text}\n\nСоставь полный текст шаблона документа.` }], { system: QNA_DRAFT_SYSTEM, max_tokens: 6000 });
    docText = API.claudeText(resp);
  } catch (e) { ctx.remove(k); ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Claude вернул ошибку: {e.message}</span></Bubble>); return; }
  ctx.remove(k);
  if (!docText || docText.length < 60) { ctx.ai('Не удалось собрать текст, уточните ответы или попробуйте ещё раз.'); return; }
  ctx.uncapture(); window.__qna = null;
  showDraft(ctx, { title: st.docType, text: docText });
}

// заполнение шаблона данными пользователя → финальный документ
async function qnaFill(ctx, { text }) {
  const tpl = window.__qnaTemplate;
  if (!tpl) { ctx.uncapture(); return ctx.ai('Шаблон не найден, начните заново.'); }
  if (/^(отмена|стоп|выйти)$/i.test((text || '').trim())) { ctx.uncapture(); window.__qnaTemplate = null; return ctx.ai('Ок, отменила.'); }
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="📄" label="заполняю документ по шаблону" count="Claude" /></Msg>);
  let docText;
  try {
    const resp = await API.claude([{ role: 'user', content: `ШАБЛОН:\n${tpl.text}\n\nДАННЫЕ ПОЛЬЗОВАТЕЛЯ:\n${text}\n\nЗаполни плейсхолдеры и верни финальный текст документа.` }], { system: QNA_FILL_SYSTEM, max_tokens: 6000 });
    docText = API.claudeText(resp);
  } catch (e) { ctx.remove(k); ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Claude вернул ошибку: {e.message}</span></Bubble>); return; }
  ctx.remove(k);
  if (!docText || docText.length < 60) { ctx.ai('Не удалось заполнить, уточните данные.'); return; }
  ctx.uncapture(); window.__qnaTemplate = null;
  const title = tpl.title;
  const url = URL.createObjectURL(window.makeWordBlob(title, '<h1>' + title + '</h1>' + window.mdToHtml(docText)));
  const fname = title.replace(/[\\/:*?"<>|]/g, ' ').slice(0, 80) + '.doc';
  ctx.setDoc(<DocFrame title={title} sub="готовый документ · редактируемый"><EditableDoc title={title} text={docText} fileName={title} /></DocFrame>);
  ctx.aiNode(<><Bubble>Готов первый документ <b>«{title}»</b> по вашему шаблону — превью справа.</Bubble>
    <div className="acta"><a className="btn-aip primary" href={url} download={fname}>Скачать Word (.doc) →</a>
      <Btn kind="dashed" onClick={() => ctx.aiNode(<EmailCompose ctx={ctx} fileName={fname} subject={title} />)}>Отправить на email</Btn>
      <div className="btn-aip dashed" onClick={() => { ctx.you('Подписать'); ctx.ai('Отправила бы на подписание УКЭП (демо).'); }}>Подписать (демо)</div></div></>);
}

window.SCENARIOS.qna = async function (ctx, { text }) {
  ctx.setHead('Составление документа', 'по вопросам · Claude');
  const need = (text || '').replace(/собер[а-я]*|состав[а-я]*|напиши|сдела[а-я]*|по вопросам|с нуля|у меня нет шаблона|нет шаблона|документ|договор/gi, '').trim();
  if (need.length < 3) {
    ctx.setDoc(<DocFrame title="текст документа" sub="соберётся из ответов"><EmptyDoc lines={['❓', 'опишите, какой документ нужен —\nзадам уточняющие вопросы']} /></DocFrame>);
    ctx.ai('Соберу документ с нуля как юрист и подведу нормативную базу. Опишите, что нужно — например: «договор оказания услуг для UX-дизайнера» или «NDA с подрядчиком».');
    ctx.capture(async (c, m) => { c.uncapture(); await askQuestions(c, (m.text || '').trim() || 'документ'); });
    return;
  }
  await askQuestions(ctx, need);
};
