/* global React, API, Bubble, DocFrame, Msg, AiProg, Btn, now */
// Протокол разногласий (реальный Claude) → генерация Word-документа (.doc, открывается в Word).
// Вызывается из сценариев «риски» и «сверка» кнопкой «Собрать протокол разногласий».

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

// ── Промпт (инженерия): роль, структура протокола, строгий JSON ──
const PROTOCOL_SYSTEM = `Ты — юрист по договорному праву РФ в сервисе DataDoc. На основе списка замечаний/расхождений составь ПРОТОКОЛ РАЗНОГЛАСИЙ к договору — официальный документ, которым сторона предлагает свои редакции спорных пунктов.

ПРАВИЛА:
- Для каждого замечания сформулируй: пункт договора; редакцию контрагента (как есть сейчас); предлагаемую редакцию (юридически корректную, готовую к вставке в договор); краткое обоснование со ссылкой на норму ГК РФ, где уместно.
- Предлагаемые формулировки — конкретные и исполнимые, деловой юридический язык, без общих слов.
- Не выдумывай пункты, которых не было во входных данных. Сохрани нумерацию/ссылки на пункты, если они даны.
- Русский язык. Верни СТРОГО валидный JSON без markdown и текста вне JSON.

СХЕМА:
{"title":"Протокол разногласий к договору …","docRef":"строка со ссылкой на договор, если известна, иначе пусто","items":[{"clause":"п. X.X / раздел","currentWording":"редакция контрагента","proposedWording":"наша предлагаемая редакция","rationale":"обоснование"}],"note":"итоговая оговорка (напр.: в остальном стороны договор принимают в редакции …)"}`;

function esc(s) {
  return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

// универсальный экспорт в Word (.doc): заголовок + произвольный HTML-текст тела
window.makeWordBlob = function (title, innerHtml) {
  const html = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head><meta charset="utf-8"><title>${esc(title)}</title>
<style>body{font-family:'Times New Roman',serif;font-size:12pt;color:#000;line-height:1.4}
h1{font-size:14pt;text-align:center}h2{font-size:12pt}p{margin:0 0 8pt}table{border-collapse:collapse}td,th{border:1px solid #000;padding:5pt}</style></head>
<body>${innerHtml}</body></html>`;
  return new Blob(['﻿' + html], { type: 'application/msword' });
};
window.mdToHtml = function (text) {
  return String(text || '').split(/\n{2,}/).map((p) => {
    const line = esc(p).replace(/\*\*([^*]+)\*\*/g, '<b>$1</b>').replace(/\n/g, '<br>');
    return /^\s*<b>[^<]+<\/b>\s*$/.test('<b>' + p + '</b>') ? line : '<p>' + line + '</p>';
  }).join('');
};

// внутренний HTML протокола (для редактора и для .doc)
function protocolInner(p) {
  const rows = (p.items || []).map((it, i) => `<tr><td style="width:32px;text-align:center">${i + 1}</td><td>${esc(it.clause)}</td><td>${esc(it.currentWording)}</td><td>${esc(it.proposedWording)}</td><td>${esc(it.rationale)}</td></tr>`).join('');
  return `<h1 style="text-align:center">${esc(p.title || 'Протокол разногласий')}</h1>${p.docRef ? `<p style="text-align:center">${esc(p.docRef)}</p>` : ''}
    <table style="border-collapse:collapse;width:100%"><thead><tr><th>№</th><th>Пункт договора</th><th>Редакция контрагента</th><th>Предлагаемая редакция</th><th>Обоснование</th></tr></thead><tbody>${rows}</tbody></table>
    <p>${esc(p.note || '')}</p>`;
}

// собираем Word-совместимый HTML и отдаём как .doc (Word открывает без проблем, без внешних библиотек)
function protocolToDocBlob(p) {
  const rows = (p.items || []).map((it, i) => `
    <tr>
      <td style="width:32px;text-align:center">${i + 1}</td>
      <td>${esc(it.clause)}</td>
      <td>${esc(it.currentWording)}</td>
      <td>${esc(it.proposedWording)}</td>
      <td>${esc(it.rationale)}</td>
    </tr>`).join('');
  const html = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head><meta charset="utf-8"><title>${esc(p.title || 'Протокол разногласий')}</title>
<style>
  body{font-family:'Times New Roman',serif;font-size:12pt;color:#000}
  h1{font-size:14pt;text-align:center;margin:0 0 4pt}
  .ref{text-align:center;font-size:11pt;color:#333;margin-bottom:12pt}
  table{border-collapse:collapse;width:100%;font-size:10.5pt}
  th,td{border:1px solid #000;padding:5pt 6pt;vertical-align:top}
  th{background:#e8eef5;font-weight:bold}
  .sign{margin-top:20pt;width:100%;border:none}
  .sign td{border:none;width:50%}
</style></head>
<body>
  <h1>${esc(p.title || 'Протокол разногласий')}</h1>
  <div class="ref">${esc(p.docRef || '')}</div>
  <table>
    <thead><tr><th>№</th><th>Пункт договора</th><th>Редакция контрагента</th><th>Предлагаемая редакция</th><th>Обоснование</th></tr></thead>
    <tbody>${rows}</tbody>
  </table>
  <p style="margin-top:12pt">${esc(p.note || '')}</p>
  <table class="sign"><tr>
    <td>Заказчик _______________ / _______________</td>
    <td style="text-align:right">Исполнитель _______________ / _______________</td>
  </tr></table>
</body></html>`;
  return new Blob(['﻿' + html], { type: 'application/msword' });
}

function ProtocolPreview({ p }) {
  return (
    <div className="docp" style={{ fontFamily: 'inherit', fontSize: 12 }}>
      <div className="bdg">Word</div>
      <h1 style={{ fontSize: 16 }}>{p.title || 'Протокол разногласий'}</h1>
      {p.docRef ? <div className="lite">{p.docRef}</div> : null}
      {(p.items || []).map((it, i) => (
        <div key={i} style={{ borderTop: '1px solid var(--line)', paddingTop: 8, marginTop: 8 }}>
          <div style={{ fontWeight: 600 }}>{i + 1}. {it.clause}</div>
          <div style={{ marginTop: 3 }}><span style={{ color: 'var(--ink-3)' }}>Сейчас: </span><span className="hl-rm">{it.currentWording}</span></div>
          <div style={{ marginTop: 3 }}><span style={{ color: 'var(--ink-3)' }}>Предлагаем: </span><span className="hl-add">{it.proposedWording}</span></div>
          {it.rationale ? <div style={{ marginTop: 3, color: 'var(--ink-3)', fontSize: 11 }}>{it.rationale}</div> : null}
        </div>
      ))}
      {p.note ? <div style={{ marginTop: 10, color: 'var(--ink-2)' }}>{p.note}</div> : null}
    </div>
  );
}

// главный вход: читает window.__lastReview (findings/diffs), просит Claude, отдаёт .doc
window.buildProtocol = async function (ctx) {
  const src = window.__lastReview;
  ctx.you('Собери протокол разногласий');
  if (!src || !src.payload || !src.payload.length) {
    ctx.ai('Сначала проверьте договор на риски или сверьте два документа — потом соберу протокол по найденным пунктам.');
    return;
  }
  ctx.setHead('Протокол разногласий', 'формирую Word · Claude');
  ctx.busy(true);
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="📝" label="составляю протокол разногласий" count="Claude" /></Msg>);
  try {
    const input = `Источник: ${src.kind === 'identity' ? 'сверка двух версий договора' : 'проверка договора на риски'}.
Замечания/расхождения (JSON):
${JSON.stringify(src.payload, null, 2)}
${src.docRef ? 'Договор: ' + src.docRef : ''}
Составь протокол разногласий и верни JSON строго по схеме.`;
    const res = await API.claudeJSON(PROTOCOL_SYSTEM, [{ type: 'text', text: input }], { max_tokens: 4000 });
    ctx.remove(k);
    const p = res.data;
    if (!p || !Array.isArray(p.items) || !p.items.length) {
      ctx.aiNode(<><Bubble>Не смогла структурировать протокол:</Bubble><Bubble plain><pre style={{ whiteSpace: 'pre-wrap', fontSize: 12, margin: 0 }}>{res.raw || '—'}</pre></Bubble></>);
      return;
    }
    const blob = protocolToDocBlob(p);
    const url = URL.createObjectURL(blob);
    const fname = (p.title || 'Протокол разногласий').replace(/[\\/:*?"<>|]/g, ' ').slice(0, 80) + '.doc';

    ctx.setDoc(
      <DocFrame title="Протокол разногласий" sub={`${p.items.length} пунктов · редактируемый`}>
        <EditableDoc title={p.title || 'Протокол разногласий'} html={protocolInner(p)} fileName={p.title || 'Протокол разногласий'} />
      </DocFrame>
    );
    ctx.aiNode(
      <>
        <Bubble>Собрала <b>протокол разногласий</b> по {p.items.length} {p.items.length === 1 ? 'пункту' : 'пунктам'}. Предлагаемые формулировки готовы к вставке в договор — превью справа.</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="Протокол разногласий" />)}>Отправить на email</Btn>
        </div>
      </>
    );
  } catch (e) {
    ctx.remove(k);
    ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Не удалось собрать протокол: {e.message}</span></Bubble>);
  } finally {
    ctx.busy(false);
  }
};
