/* global React, API, Msg, Bubble, Mention, DocFrame, EmptyDoc, AiProg, Btn, now */
// Сценарий 3 — Добавление контрагента. Живой поиск (≥3 символов): сначала контрагенты аккаунта,
// затем ЕГРЮЛ через Dadata. Визуал из макета s4.

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

// ── нормализация ответа Dadata suggestparty ──
function pickSuggestions(resp) {
  if (!resp) return [];
  if (Array.isArray(resp)) return resp;
  if (Array.isArray(resp.suggestions)) return resp.suggestions;
  if (resp.data || resp.value) return [resp];
  return [];
}
function partyFields(s) {
  const d = (s && s.data) || s || {};
  const nm = d.name || {};
  const fio = d.fio || {};
  return {
    value: s.value || nm.short_with_opf || nm.full_with_opf || (fio.surname ? [fio.surname, fio.name, fio.patronymic].filter(Boolean).join(' ') : '') || d.name || '—',
    full: nm.full_with_opf || nm.short_with_opf || s.value || '—',
    inn: d.inn || '', kpp: d.kpp || '', ogrn: d.ogrn || '',
    director: (d.management && d.management.name) || (fio.surname ? [fio.surname, fio.name, fio.patronymic].filter(Boolean).join(' ') : '') || '—',
    address: (d.address && (d.address.unrestricted_value || d.address.value)) || '—',
    okved: d.okved || '',
    status: (d.state && d.state.status) || '',
    type: d.type === 'INDIVIDUAL' ? 'individual' : 'entity',
  };
}
const statusRu = (s) => ({ ACTIVE: 'действующее', LIQUIDATING: 'ликвидируется', LIQUIDATED: 'ликвидировано', BANKRUPT: 'банкротство', REORGANIZING: 'реорганизация' }[s] || s || 'действующее');

// ── живой поиск контрагента ──
function PartySearch({ ctx, initialQuery = '' }) {
  const [q, setQ] = React.useState(initialQuery);
  const [loading, setLoading] = React.useState(false);
  const [res, setRes] = React.useState(null); // {base:[], egrul:[]}
  const seq = React.useRef(0);

  React.useEffect(() => {
    const query = q.trim();
    if (query.length < 3) { setRes(null); setLoading(false); return; }
    setLoading(true);
    const my = ++seq.current;
    const t = setTimeout(async () => {
      let base = [], egrul = [];
      try { const r = await API.searchCounteragents(query); base = r.items || []; } catch (e) { /* ignore */ }
      try { egrul = pickSuggestions(await API.suggestParty(query, 6)).map(partyFields); } catch (e) { /* ignore */ }
      if (my !== seq.current) return; // пришёл более свежий запрос
      const innInBase = new Set(base.map((b) => b.inn).filter(Boolean));
      egrul = egrul.filter((e) => !e.inn || !innInBase.has(e.inn));
      setRes({ base, egrul });
      setLoading(false);
    }, 320);
    return () => clearTimeout(t);
  }, [q]);

  const pickBase = (it) => showCard(ctx, { value: it.legalName || it.name || it.fullName || '—', inn: it.inn || '', type: it.type, source: 'base', id: it.id });
  const pickEgrul = (p) => showCard(ctx, Object.assign({}, p, { source: 'egrul' }));

  return (
    <div className="cpcard" style={{ maxWidth: 460 }}>
      <div className="h"><div className="nm">Поиск контрагента</div><div className="ok">живой</div></div>
      <input autoFocus value={q} onChange={(e) => setQ(e.target.value)}
        placeholder="ИНН, ОГРН или название компании…"
        style={{ width: '100%', margin: '8px 0', padding: '9px 11px', border: '1px solid var(--line-2)', borderRadius: 8, fontSize: 13, fontFamily: 'var(--sans)' }} />
      {q.trim().length > 0 && q.trim().length < 3 ? <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>введите ещё {3 - q.trim().length} символа…</div> : null}
      {loading ? <div style={{ fontSize: 12, color: 'var(--ink-3)', padding: '4px 0' }}>ищу…</div> : null}
      {res ? (
        <div style={{ display: 'flex', flexDirection: 'column', gap: 3, maxHeight: 260, overflowY: 'auto' }}>
          {res.base.length ? <div className="cpsec">В вашей базе</div> : null}
          {res.base.map((it) => (
            <div key={'b' + it.id} className="btn-aip" style={{ textAlign: 'left', padding: '8px 11px' }} onClick={() => pickBase(it)}>
              👤 {it.legalName || it.name || it.fullName} {it.inn ? <span style={{ color: 'var(--ink-3)', fontSize: 11 }}>· ИНН {it.inn}</span> : null}
            </div>
          ))}
          {res.egrul.length ? <div className="cpsec">Из ЕГРЮЛ (Dadata)</div> : null}
          {res.egrul.map((p, i) => (
            <div key={'e' + i} className="btn-aip" style={{ textAlign: 'left', padding: '8px 11px' }} onClick={() => pickEgrul(p)}>
              🏢 {p.value} {p.inn ? <span style={{ color: 'var(--ink-3)', fontSize: 11 }}>· ИНН {p.inn}</span> : null}
            </div>
          ))}
          {!res.base.length && !res.egrul.length && !loading ? <div style={{ fontSize: 12, color: 'var(--ink-3)', padding: 6 }}>ничего не нашлось — проверьте ИНН/название</div> : null}
        </div>
      ) : null}
    </div>
  );
}

// ── карточка + сохранение ──
function CounteragentResult({ ctx, p }) {
  const [state, setState] = React.useState(p.source === 'base' ? 'inbase' : 'idle');
  const [msg, setMsg] = React.useState('');

  const save = async () => {
    setState('saving');
    // верхнеуровневые поля (как в ответе GET) — не через attrValues с кодами
    const body = {
      type: p.type === 'individual' ? 'individual' : 'entity', selfowned: false, favorite: false,
      name: p.value, legalName: p.value, fullName: p.full || p.value,
      inn: p.inn || undefined, kpp: p.kpp || undefined, ogrn: p.ogrn || undefined,
    };
    try {
      const r = await API.datadoc('POST', '/counteragents', body);
      ctx.addContractor({ id: r.id || ('cp' + p.inn), name: p.value, inn: p.inn });
      setState('done'); setMsg('в базе, ID: ' + (r.id || '—'));
    } catch (e) {
      // без сопоставления полей аккаунта запись в базу может не пройти — не роняем флоу
      ctx.addContractor({ id: 'sess-' + (p.inn || p.value), name: p.value, inn: p.inn });
      setState('session'); setMsg(e.message);
    }
  };

  return (
    <>
      <Bubble>{p.source === 'base' ? 'Контрагент уже в вашей базе. Реквизиты из ЕГРЮЛ:' : 'Нашла в ЕГРЮЛ через Dadata. Проверьте реквизиты:'}</Bubble>
      <div className="cpcard">
        <div className="h"><div className="nm">{p.value}</div><div className="ok">{p.source === 'base' ? '✓ в базе' : '✓ ЕГРЮЛ'}</div></div>
        <div className="cprow"><span className="k">ИНН / КПП</span><span className="v auto">{p.inn || '—'}{p.kpp ? ' / ' + p.kpp : ''}</span></div>
        {p.ogrn ? <div className="cprow"><span className="k">ОГРН</span><span className="v auto">{p.ogrn}</span></div> : null}
        <div className="cprow"><span className="k">{p.type === 'individual' ? 'ИП' : 'Директор'}</span><span className="v auto">{p.director || '—'}</span></div>
        <div className="cprow"><span className="k">Адрес</span><span className="v auto">{p.address || '—'}</span></div>
        {p.okved ? <div className="cprow"><span className="k">ОКВЭД</span><span className="v auto">{p.okved}</span></div> : null}
        <div className="cprow"><span className="k">Статус</span><span className="v auto">{statusRu(p.status)}</span></div>
      </div>

      {state === 'done' ? (
        <Bubble><span style={{ color: '#1f6b3a' }}>✓ Контрагент сохранён — {msg}. Доступен по <Mention kind="cp" name={p.value} /> в документах.</span></Bubble>
      ) : state === 'session' ? (
        <Bubble><span style={{ color: '#1f6b3a' }}>✓ Контрагент добавлен и доступен по <Mention kind="cp" name={p.value} /> в документах.</span>
          <div style={{ fontSize: 11, color: 'var(--ink-3)', marginTop: 4 }}>Реквизиты — реальные из ЕГРЮЛ. Запись в общую базу аккаунта требует сопоставления полей контрагента ({msg}).</div>
        </Bubble>
      ) : state === 'inbase' ? (
        <div className="acta"><Btn kind="primary" onClick={() => { ctx.you('Создать документ с ним'); ctx.ai('Выберите шаблон командой «заполнить документ» — подставлю этого контрагента.'); }}>Создать документ с ним →</Btn></div>
      ) : (
        <div className="acta">
          <Btn kind="primary" onClick={save}>{state === 'saving' ? 'Сохраняю…' : 'Сохранить контрагента →'}</Btn>
        </div>
      )}
    </>
  );
}

async function showCard(ctx, party) {
  ctx.setHead('Добавление контрагента', 'из ЕГРЮЛ · Dadata');
  ctx.you(<>Выбрать <Mention kind="cp" name={party.value} /></>);
  // обогащаем данными ЕГРЮЛ (для base — тоже, чтобы карточка была полной)
  let p = party;
  if (!party.director || !party.address) {
    const k = ctx.node(<Msg who="ai" ts={now()}><AiProg icon="🔎" label="загружаю данные из ЕГРЮЛ" count="Dadata" /></Msg>);
    try {
      const full = pickSuggestions(await API.suggestParty(party.inn || party.value, 1)).map(partyFields)[0];
      if (full) p = Object.assign({}, full, { source: party.source, id: party.id });
    } catch (e) { /* оставим что есть */ }
    ctx.remove(k);
  }
  ctx.setDoc(
    <DocFrame title={p.value} sub={party.source === 'base' ? 'контрагент в базе' : 'данные из ЕГРЮЛ · проверено'} toolbar={<div className="b">ЕГРЮЛ</div>}>
      <div className="docp" style={{ fontFamily: 'inherit', fontSize: 12 }}>
        <div className="bdg" style={{ background: '#d4ecdb', borderColor: '#1f6b3a' }}>{statusRu(p.status)}</div>
        <h1 style={{ fontSize: 20 }}>{p.value}</h1>
        <div className="cprow"><span className="k">ИНН / КПП</span><span className="v">{p.inn || '—'}{p.kpp ? ' / ' + p.kpp : ''}</span></div>
        {p.ogrn ? <div className="cprow"><span className="k">ОГРН</span><span className="v">{p.ogrn}</span></div> : null}
        <div className="cprow"><span className="k">{p.type === 'individual' ? 'ИП' : 'Директор'}</span><span className="v">{p.director || '—'}</span></div>
        <div className="cprow"><span className="k">Адрес</span><span className="v">{p.address || '—'}</span></div>
        {p.okved ? <div className="cprow"><span className="k">ОКВЭД</span><span className="v">{p.okved}</span></div> : null}
      </div>
    </DocFrame>
  );
  ctx.aiNode(<CounteragentResult ctx={ctx} p={p} />);
}
window.ddShowParty = showCard; // используется @-поповером
window.ddPickSuggestions = pickSuggestions;
window.ddPartyFields = partyFields;

window.SCENARIOS.counteragent = async function (ctx, { text }) {
  const inn = (text.match(/\b\d{10}(?:\d{2})?(?:\d{3})?\b/) || [])[0];
  let query = inn || '';
  if (!query) {
    const m = text.replace(/добав.*контрагент[а-я]*|контрагент[а-я]*|по названию|найди|компани[ияю]|поставщик[а-я]*/gi, '').trim();
    if (m.length >= 3) query = m;
  }
  ctx.setDoc(<DocFrame title="карточка контрагента" sub="заполнится из ЕГРЮЛ">
    <EmptyDoc lines={['👥', 'начните вводить ИНН, ОГРН\nили название — найду в ЕГРЮЛ']} />
  </DocFrame>);
  ctx.aiNode(
    <>
      <Bubble>Найду контрагента: начните вводить <b>ИНН, ОГРН или название</b> — сначала ищу в вашей базе, затем в ЕГРЮЛ через Dadata (живой поиск от 3 символов).</Bubble>
      <PartySearch ctx={ctx} initialQuery={query} />
    </>
  );
};
