/* global React, API, Msg, Bubble, DocFrame, EmptyDoc, AiProg, Btn, now */
// Сценарий 4 — Проверка договора на риски / слабые места (реальный Claude).
// Визуал из макета s8 (.find карточки: sev/who/what/why/fix).

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

// ── Промпт (инженерия): роль, метод, рубрика серьёзности, строгий JSON ──
const RISK_SYSTEM = `Ты — старший юрист по договорному праву РФ в сервисе DataDoc. Проверяешь договор с позиции ЗАЩИЩАЮЩЕЙ стороны (того, кто прислал документ на проверку) и ищешь, чем он невыгоден или опасен.

ЧТО ИСКАТЬ (по разделам):
- Асимметрия ответственности: неустойки/штрафы/пени только для одной стороны; несоразмерные санкции.
- Расторжение и отказ: односторонний выход без компенсации, короткие сроки уведомления.
- Оплата: длинные отсрочки, оплата «по факту» без гарантий, отсутствие аванса, привязка оплаты к субъективной приёмке.
- Приёмка результата: нет порядка приёмки/актов, «молчаливое» непринятие, право отклонить без мотивации.
- Ответственность и риски: пределы ответственности, форс-мажор в пользу одной стороны, возмещение убытков.
- Сроки и просрочка: жёсткие сроки без оговорок о встречных обязательствах.
- Подсудность и право: неудобная подсудность, третейские оговорки.
- Конфиденциальность, интеллектуальные права, персональные данные (152-ФЗ) — если применимо.
- Пробелы: отсутствующие существенные условия, размытые формулировки («надлежащее качество» без критериев).

ПРАВИЛА:
- Опирайся ТОЛЬКО на текст договора. Не выдумывай пункты и цитаты; если пункт не пронумерован — опиши раздел словами.
- Где уместно, ссылайся на нормы ГК РФ (например, ст. 717, 782, 333) — коротко и по делу, без юридической воды.
- Каждая находка: конкретная, с указанием места, объяснением риска и практичной правкой-предложением.
- severity: "high" — существенно бьёт по интересам/деньгам/выходу из сделки; "medium" — заметный дисбаланс/пробел; "low" — формальность или улучшение.
- Если текста недостаточно для анализа — верни findings: [] и объясни это в verdict.
- Отвечай на русском. Верни СТРОГО валидный JSON без markdown и пояснений вне JSON.

СХЕМА:
{"verdict":"1-2 предложения: в чью пользу договор и главный вывод","score":"N/100 (0=кабальный, 100=сбалансированный)","findings":[{"severity":"high|medium|low","location":"п. X.X / раздел","what":"суть риска","why":"почему это плохо для проверяющей стороны","fix":"конкретная правка"}]}`;

const sevClass = (s) => (s === 'high' ? 'high' : s === 'low' ? 'low' : 'med');
const sevRu = (s) => (s === 'high' ? 'высокий' : s === 'low' ? 'низкий' : 'средний');

window.SCENARIOS.risk = async function (ctx, { text, files }) {
  const hasFile = files && files.length;
  const contractText = (text || '').replace(/провер[а-я]*|риск[а-я]*|слаб[а-я ]*мест[а-я]*|найди|договор[а-я]*/gi, '').trim();
  const hasText = contractText.length > 200;

  if (!hasFile && !hasText) {
    ctx.expect('risk');
    ctx.setDoc(<DocFrame title="проверяемый договор" sub="приложите файл или вставьте текст">
      <EmptyDoc lines={['🛡', 'дайте договор —\nнайду слабые места и риски']} />
    </DocFrame>);
    ctx.ai('Проверю договор глазами юриста: где формулировки размыты, чьи интересы перевешивают, чего не хватает. Приложите файл (PDF, DOCX, скан) 📎 или вставьте текст договора в сообщение.');
    return;
  }

  ctx.ai('Читаю договор — оцениваю формулировки, баланс ответственности и пробелы.');
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="🛡" label="анализ рисков" pct={72} count="Claude" /></Msg>);

  const content = [];
  if (hasFile) {
    const { blocks, warnings } = await API.filesToContent(files);
    content.push(...blocks);
    if (warnings.length) { ctx.remove(k); ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Не удалось прочитать файлы: {warnings.join('; ')}</span></Bubble>); if (!blocks.length && !hasText) return; }
  }
  if (hasText) content.push({ type: 'text', text: 'Текст договора:\n' + text });
  content.push({ type: 'text', text: 'Проверь этот договор и верни JSON строго по заданной схеме.' });

  let res;
  try { res = await API.claudeJSON(RISK_SYSTEM, content, { max_tokens: 4000 }); }
  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 || !Array.isArray(d.findings)) {
    ctx.aiNode(<><Bubble>Не смогла структурировать ответ модели:</Bubble>
      <Bubble plain><pre style={{ whiteSpace: 'pre-wrap', fontSize: 12, margin: 0 }}>{res.raw || '—'}</pre></Bubble></>);
    return;
  }

  // сохраняем для генерации протокола разногласий
  window.__lastReview = { kind: 'risk', payload: d.findings, docRef: (files && files[0] && files[0].name) || (d.verdict || '') };

  const hi = d.findings.filter((f) => f.severity === 'high').length;
  ctx.setDoc(
    <DocFrame title={`${d.findings.length} находок`} sub={d.score ? 'оценка ' + d.score : 'проверка договора'}>
      <div className="docp">
        <div className="bdg" style={{ background: hi ? '#f9c8c4' : '#d4ecdb', borderColor: hi ? '#c33' : '#1f6b3a' }}>{hi ? 'есть риски' : 'проверено'}</div>
        <h1 style={{ fontSize: 18 }}>Заключение по договору</h1>
        <div className="lite">{d.verdict}</div>
        {d.findings.slice(0, 8).map((f, i) => (
          <p key={i} style={{ marginTop: 8 }}><b>{f.location}</b> — <span style={{ background: f.severity === 'high' ? '#f9c8c4' : 'transparent', padding: '0 2px' }}>{f.what}</span></p>
        ))}
      </div>
    </DocFrame>
  );

  ctx.aiNode(
    <>
      <Bubble>Проверила договор. <b>{d.verdict}</b>{d.score ? ` (${d.score})` : ''} Нашла <b>{d.findings.length}</b> {d.findings.length === 1 ? 'слабое место' : 'слабых мест'}.</Bubble>
      {d.findings.map((f, i) => (
        <div className="find" key={i}>
          <div className="head"><div className={`sev ${sevClass(f.severity)}`}>{sevRu(f.severity)}</div><div className="who">{f.location}</div></div>
          <div className="what">{f.what}</div>
          {f.why ? <div className="why">{f.why}</div> : null}
          {f.fix ? <div className="fix">✓ предлагаю: {f.fix}</div> : null}
        </div>
      ))}
      <div className="acta">
        <Btn kind="primary" onClick={() => window.buildProtocol(ctx)}>Собрать протокол разногласий (Word) →</Btn>
      </div>
    </>
  );
};
