/* global React, API, Msg, Bubble, AttachedFiles, DocFrame, EmptyDoc, AiProg, Btn, now */
// Сценарий 5 — Сверка документов на тождественность (реальный Claude).
// Визуал из макета s6 (.verdict + .difflist/.diffrow + колонки .diff).

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

// ── Промпт (инженерия): методика сверки, критерии, строгий JSON ──
const ID_SYSTEM = `Ты — модуль DataDoc для сверки двух версий одного документа на тождественность. Тебе дают ДОКУМЕНТ A (наш экземпляр) и ДОКУМЕНТ B (версия контрагента).

МЕТОДИКА — сверяй по пунктам, сравнивая по этим осям:
1) Стороны и реквизиты: наименования, ИНН/КПП/ОГРН, адреса, подписанты, банковские реквизиты (р/с, к/с, БИК).
2) Предмет договора и объём.
3) Суммы, цены, НДС, порядок расчёта.
4) Сроки: исполнения, оплаты, действия договора, уведомлений.
5) Права и обязанности сторон, ответственность, неустойки.
6) Порядок расторжения, форс-мажор, подсудность.
7) Формулировки конкретных пунктов (смысловые и текстовые отличия), добавленные/удалённые пункты.

ПРАВИЛА:
- Сравнивай и по смыслу, и дословно. Улавливай замену чисел, сроков, реквизитов и переформулировки.
- identical = true ТОЛЬКО если нет ни смысловых, ни существенных текстовых расхождений (косметика/пунктуация допустимы).
- matchPercent — честная оценка совпадения 0..100.
- Для каждого расхождения укажи место, значение у нас (ours) и у контрагента (theirs) и его важность (note): "существенное" (деньги, сроки, реквизиты, ответственность) или "несущественное".
- Ничего не выдумывай. Если документ пуст/нечитаем — отметь это в summary и не фантазируй расхождения.
- Отвечай на русском. Верни СТРОГО валидный JSON без markdown и текста вне JSON.

СХЕМА:
{"identical":true|false,"matchPercent":0-100,"summary":"вывод одним предложением","differences":[{"location":"п. X / реквизит","ours":"как в A","theirs":"как в B","note":"существенное|несущественное — краткое пояснение"}]}`;

// один документ → массив content-блоков с меткой
async function docPart(file, label) {
  const parts = [{ type: 'text', text: label }];
  const text = await API.fileToText(file); // может бросить (для DOCX без ключа) — ловим выше
  if (text !== null) parts.push({ type: 'text', text });
  else parts.push(await API.fileToClaudeBlock(file));
  return parts;
}

window.SCENARIOS.identity = async function (ctx, { files }) {
  files = files || [];
  ctx.setDoc(<DocFrame title="сверка" sub="приложите два файла">
    <EmptyDoc lines={['⚖', 'дайте два документа —\nсравню слово в слово']} />
  </DocFrame>);

  if (files.length < 2) {
    ctx.expect('identity');
    ctx.ai(files.length === 1
      ? 'Получила первый документ. Приложите второй (📎) — например версию контрагента — и я сверю их. (Пришлите оба файла одним сообщением.)'
      : 'Сравню два документа посимвольно и по смыслу. Приложите оба файла (PDF, DOCX, скан) 📎 одним сообщением: наш экземпляр и версию контрагента.');
    return;
  }

  const [a, b] = files;
  ctx.ai(`Сверяю «${a.name}» и «${b.name}» — реквизиты, суммы, сроки, формулировки пунктов.`);
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="⚖" label="сравниваю" pct={80} count="Claude" /></Msg>);

  let content;
  try {
    const pa = await docPart(a, 'ДОКУМЕНТ A (наш экземпляр):');
    const pb = await docPart(b, 'ДОКУМЕНТ B (версия контрагента):');
    content = [...pa, ...pb, { type: 'text', text: 'Сверь A и B на тождественность и верни JSON строго по схеме.' }];
  } catch (e) {
    ctx.remove(k); ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Не удалось прочитать файлы: {e.message}</span></Bubble>); return;
  }

  let res;
  try { res = await API.claudeJSON(ID_SYSTEM, content, { max_tokens: 3500 }); }
  catch (e) { ctx.remove(k); ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Claude вернул ошибку: {e.message}</span></Bubble>); return; }
  ctx.remove(k);

  const d = res.data;
  if (!d || typeof d.identical === 'undefined') {
    ctx.aiNode(<><Bubble>Не смогла структурировать ответ модели:</Bubble>
      <Bubble plain><pre style={{ whiteSpace: 'pre-wrap', fontSize: 12, margin: 0 }}>{res.raw || '—'}</pre></Bubble></>);
    return;
  }
  const diffs = Array.isArray(d.differences) ? d.differences : [];
  const pct = d.matchPercent != null ? d.matchPercent : (d.identical ? 100 : 0);

  // сохраняем расхождения для протокола разногласий
  window.__lastReview = { kind: 'identity', payload: diffs, docRef: `${a.name} ↔ ${b.name}` };

  ctx.setDoc(
    <DocFrame title={d.identical ? 'идентичны' : diffs.length + ' расхождений'} sub={`совпадение ${pct}%`} toolbar={<div className="b">только diff</div>}>
      <div className="diff">
        <div className="col"><div className="h">наш экземпляр ({a.name})</div>
          {diffs.length ? diffs.map((x, i) => <p key={i} style={{ marginTop: i ? 8 : 0 }}><b>{x.location}.</b> <span className="hl-rm">{x.ours}</span></p>)
            : <p style={{ color: 'var(--ink-3)' }}>расхождений не найдено</p>}
        </div>
        <div className="col"><div className="h">версия контрагента ({b.name})</div>
          {diffs.length ? diffs.map((x, i) => <p key={i} style={{ marginTop: i ? 8 : 0 }}><b>{x.location}.</b> <span className="hl-add">{x.theirs}</span></p>)
            : <p style={{ color: 'var(--ink-3)' }}>расхождений не найдено</p>}
        </div>
      </div>
    </DocFrame>
  );

  ctx.aiNode(
    <>
      <Bubble>Сверка завершена.</Bubble>
      <div className={`verdict ${d.identical ? '' : 'diff'}`}>
        <div className="big">{d.identical ? '=' : '≠'}</div>
        <div className="txt"><b>{d.identical ? 'Документы идентичны.' : 'Документы не идентичны.'}</b> Совпадение {pct}%. {d.summary || (diffs.length ? `Найдено ${diffs.length} расхождений.` : '')}</div>
      </div>
      {diffs.length ? (
        <div className="difflist">
          {diffs.map((x, i) => (
            <div className="diffrow" key={i}>
              <div className="loc">{x.location}</div>
              <div className="pair"><b>{x.note || 'Различие.'}</b> У нас <span className="hl-rm">{x.ours}</span>, у контрагента <span className="hl-add">{x.theirs}</span>.</div>
            </div>
          ))}
        </div>
      ) : null}
      {diffs.length ? (
        <div className="acta">
          <Btn kind="primary" onClick={() => window.buildProtocol(ctx)}>Собрать протокол разногласий (Word) →</Btn>
        </div>
      ) : null}
    </>
  );
};
