/* global React, API, Bubble, DocFrame, EmptyDoc, Msg, AiProg, Btn, now */
// Сценарий 3 — Поиск документов на естественном языке. Claude разбирает запрос в фильтры,
// показываем чипы применённых фильтров + результаты с суммами и статусами (визуал s3).
// Реальные документы из /renders при подключённом ключе; иначе — демо-набор из макета.

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

const FIND_SYSTEM = `Ты — модуль поиска документов DataDoc. Разбери поисковый запрос на естественном языке в структуру фильтров.
Верни СТРОГО JSON: {"filters":["контрагент: Восход","апр–июн 2026","сумма > 100 000 ₽","не подписан"],"contractor":"","periodLabel":"","minAmount":0,"status":"","docType":""}.
"filters" — короткие человекочитаемые чипы применённых условий (2–5 шт.). status: "не подписан"/"подписан"/"" . minAmount — число или 0. Русский, без текста вне JSON.`;

const sigRu = (s) => ({ SINGLE_SIGNED: 'подписан вами', SIGNED: 'подписан', NOT_SIGNED: 'не подписан', DOUBLE_SIGNED: 'подписан' }[s] || '');

// демо-набор, отражающий макет (когда нет ключа DataDoc)
const DEMO_DOCS = [
  { name: 'Договор поставки №52', date: '08.06.2026', contractor: 'ООО Восход', amount: 180000, status: 'не подписан' },
  { name: 'Договор услуг №49', date: '21.05.2026', contractor: 'ООО Восход', amount: 140000, status: 'не подписан' },
  { name: 'Счёт №47', date: '08.05.2026', contractor: 'ООО Восход', amount: 120000, status: 'не подписан' },
];

const chipStyle = { fontSize: 12, background: 'var(--blue-50)', color: 'var(--blue)', border: '1px solid var(--blue-100)', borderRadius: 999, padding: '3px 10px', display: 'inline-flex', gap: 6, alignItems: 'center' };

function DocRow({ d, i }) {
  return (
    <div style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '10px 12px', borderTop: i ? '1px solid var(--line)' : 'none' }}>
      <div style={{ fontSize: 15 }}>§</div>
      <div style={{ minWidth: 0, flex: 1 }}>
        <div style={{ fontSize: 13, fontWeight: 500, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{d.name}</div>
        <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>{d.date}{d.contractor ? <> · <span style={{ background: '#fff6cf', padding: '0 3px', borderRadius: 3 }}>{d.contractor}</span></> : ''}</div>
      </div>
      {d.amount != null ? <div style={{ fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' }}>{d.amount.toLocaleString('ru-RU')} ₽</div> : null}
      <div className={`stat ${/не подписан/.test(d.status) ? '' : 'signed'}`} style={{ color: /не подписан/.test(d.status) ? 'var(--amber, #b8860b)' : '#1f6b3a', fontSize: 11.5, whiteSpace: 'nowrap' }}>{d.status}</div>
    </div>
  );
}

window.SCENARIOS.find = async function (ctx, { text }) {
  ctx.setHead('Поиск документов', 'по естественному языку');
  ctx.setDoc(<DocFrame title="поиск" sub="по вашим документам"><EmptyDoc lines={['🔎', 'разбираю запрос\nи ищу документы…']} /></DocFrame>);
  const k = ctx.node(<Msg who="ai" ts={now()}><AiProg label="ищу документы" /></Msg>);

  // 1) разбор запроса в фильтры (Claude)
  let parsed = {};
  try { parsed = (await API.claudeJSON(FIND_SYSTEM, [{ type: 'text', text }], { max_tokens: 700 })).data || {}; } catch (e) { /* без фильтров */ }
  const chips = Array.isArray(parsed.filters) && parsed.filters.length ? parsed.filters : [text.trim()].filter(Boolean);

  // 2) документы: реальные из /renders, иначе демо
  let docs = null; let real = false;
  try {
    const data = await API.datadoc('GET', '/renders?to=40');
    const list = (data && data.renders) || [];
    if (list.length) {
      real = true;
      docs = list.map((r) => ({ name: r.name || 'Документ', date: r.createdAt ? new Date(r.createdAt).toLocaleDateString('ru-RU') : '', contractor: '', amount: null, status: sigRu(r.signature && r.signature.status) || (r.confirmed ? 'подписан' : 'не подписан') }));
      // грубая фильтрация по статусу, если задан
      if (/не подписан/.test(parsed.status || '')) docs = docs.filter((d) => /не подписан/.test(d.status));
    }
  } catch (e) { /* нет ключа/сети → демо */ }
  if (!docs || !docs.length) docs = DEMO_DOCS;
  ctx.remove(k);

  const totalAmount = docs.reduce((s, d) => s + (d.amount || 0), 0);
  const allUnsigned = docs.every((d) => /не подписан/.test(d.status));

  ctx.setDoc(
    <DocFrame title={`найдено: ${docs.length}`} sub={real ? 'ваши документы' : 'демо-выдача'}>
      <div className="docp" style={{ fontFamily: 'inherit', fontSize: 12 }}>
        <div className="bdg">результаты</div>
        <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, margin: '2px 0 10px' }}>{chips.map((c, i) => <span key={i} style={chipStyle}>{c}</span>)}</div>
        {docs.map((d, i) => <div key={i} className="cprow"><span className="k">{d.date}</span><span className="v">{d.name}{d.amount != null ? ' · ' + d.amount.toLocaleString('ru-RU') + ' ₽' : ''}</span></div>)}
      </div>
    </DocFrame>
  );

  ctx.aiNode(
    <>
      <Bubble>Нашла <b>{docs.length}</b> {docs.length === 1 ? 'документ' : docs.length < 5 ? 'документа' : 'документов'}. Применённые фильтры:</Bubble>
      <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, margin: '2px 0 4px' }}>
        {chips.map((c, i) => <span key={i} style={chipStyle}>{c} <span style={{ opacity: 0.55, cursor: 'pointer' }}>✕</span></span>)}
      </div>
      <div style={{ border: '1px solid var(--line)', borderRadius: 12, overflow: 'hidden', background: 'var(--paper)' }}>
        {docs.map((d, i) => <DocRow key={i} d={d} i={i} />)}
      </div>
      <div className="acost"><span>итого: <b>{docs.length}</b> {docs.length < 5 ? 'документа' : 'документов'}</span>{totalAmount ? <><span>·</span><span><b>{totalAmount.toLocaleString('ru-RU')} ₽</b></span></> : null}{allUnsigned ? <><span>·</span><span>все ждут подписи</span></> : null}</div>
      {!real ? <div style={{ fontSize: 11, color: 'var(--ink-3)', marginTop: 4 }}>демо-выдача · с подключённым ключом DataDoc ищет по вашим реальным документам</div> : null}
      <div className="acta">
        <Btn kind="dashed" onClick={() => { ctx.you('Сузь выдачу'); ctx.ai('Уточните критерий — например: «только договоры» или «за июнь дороже 150 000 ₽».'); }}>Уточнить / сузить</Btn>
        {allUnsigned ? <Btn kind="primary" onClick={() => { ctx.you('Отправить все на подпись'); ctx.ai('Отправила бы все на подписание УКЭП пачкой (демо).'); }}>Отправить все на подпись →</Btn> : null}
      </div>
    </>
  );
};
