/* global React, API, Msg, Bubble, DocFrame, EmptyDoc, AiProg, Btn, now */
// Сценарий 6 — Распознавание сканов (реальный Claude vision).
// Любой скан/фото/PDF → извлечённые структурированные данные.

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

const SCAN_SYSTEM =
  'Ты — модуль DataDoc для извлечения данных из сканов документов. ' +
  'Проанализируй вложение и верни СТРОГО JSON без пояснений в формате: ' +
  '{"doctype":"тип документа по-русски","fields":[{"label":"поле","value":"значение"}],"summary":"1-2 предложения о документе"}. ' +
  'Извлекай все значимые реквизиты (ФИО, даты, номера, суммы, ИНН/ОГРН, адреса, стороны). Значения — как в документе.';

window.SCENARIOS.scan = async function (ctx, { text, files }) {
  const file = (files || [])[0];
  if (!file) {
    ctx.expect('scan');
    ctx.setDoc(<DocFrame title="распознавание скана" sub="извлечём данные из файла">
      <EmptyDoc lines={['📎', 'приложите скан, фото, PDF или DOCX —\nизвлеку данные полями']} />
    </DocFrame>);
    ctx.ai('Пришлите скан, фотографию, PDF или DOCX (кнопка 📎) — распознаю через Claude и разложу данные по полям.');
    return;
  }

  ctx.ai(`Читаю файл «${file.name}» через Claude…`);
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="⌁" label="извлекаю данные" pct={66} count={file.name} /></Msg>);

  let contentBlock;
  try {
    const txt = await API.fileToText(file); // DOCX/текст → строка; картинка/PDF → null
    contentBlock = txt !== null ? { type: 'text', text: `[Файл: ${file.name}]\n${txt}` } : await API.fileToClaudeBlock(file);
  } catch (e) {
    ctx.remove(k); ctx.aiNode(<Bubble><span style={{ color: '#c33' }}>Не смог прочитать файл: {e.message}</span></Bubble>); return;
  }

  let res;
  try {
    res = await API.claudeJSON(SCAN_SYSTEM, [contentBlock, { type: 'text', text: (text || '') + '\nИзвлеки данные из этого документа и верни JSON.' }], { max_tokens: 2500 });
  } 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.fields)) {
    ctx.aiNode(<><Bubble>Распознала, но не смогла структурировать ответ. Вот что вернула модель:</Bubble>
      <Bubble plain><pre style={{ whiteSpace: 'pre-wrap', fontSize: 12, margin: 0 }}>{res.raw || '—'}</pre></Bubble></>);
    return;
  }

  ctx.setDoc(
    <DocFrame title={d.doctype || 'распознанный документ'} sub={`${d.fields.length} полей · Claude`}>
      <div className="docp" style={{ fontFamily: 'inherit', fontSize: 12 }}>
        <div className="bdg" style={{ background: '#d8ebff', color: '#006edd' }}>{d.doctype || 'документ'}</div>
        {d.fields.map((f, i) => (
          <div className="cprow" key={i}><span className="k">{f.label}</span><span className="v auto">{String(f.value)}</span></div>
        ))}
      </div>
    </DocFrame>
  );
  ctx.aiNode(
    <>
      <Bubble>Распознала «{file.name}». {d.summary || 'Извлекла ключевые поля:'}</Bubble>
      <div className="cpcard">
        <div className="h"><div className="nm">{d.doctype || 'документ'}</div><div className="ok">✓ Claude</div></div>
        {d.fields.slice(0, 8).map((f, i) => (
          <div className="cprow" key={i}><span className="k">{f.label}</span><span className="v auto">{String(f.value)}</span></div>
        ))}
      </div>
      <div className="acta">
        <Btn kind="primary" onClick={() => { ctx.you('Добавь как контрагента'); ctx.ai('Могу добавить контрагента по этим данным — дайте команду «добавь контрагента, ИНН …», подставлю распознанный ИНН.'); }}>Добавить контрагента</Btn>
        <Btn kind="dashed" onClick={() => { ctx.you('Подставь в документ'); ctx.ai('Выберите шаблон командой «заполни документ по шаблону» — подставлю распознанные поля.'); }}>Подставить в документ</Btn>
      </div>
    </>
  );
};
