/* calc2-packages.jsx — пакеты услуг в смете: чипы включения, баннер предупреждений,
   карточка виртуального этапа (шаги пакетов, посаженные в фазу по якорю).
   Данные — из Calc2.packageSlots / packageWarnings (calc2-engine.js). */
(function () {
  const C = window.Calc2;
  const { Ic } = window;

  /* ── чипы «Пакеты услуг · из конструктора» ── */
  function PackageChips({ est, setEst, role }) {
    const list = C.activePackages(role);
    const cur = est.packages || {};
    // включённые ранее, но уже неактивные/удалённые в конструкторе — показываем как архивные
    const archived = Object.keys(cur)
      .filter((id) => !list.some((p) => p.id === id))
      .map((id) => ({ ...(C.packageById(id) || { id, name: 'Пакет удалён', icon: '📦', color: '#a3a3a3', steps: [] }), archived: true }));
    if (!list.length && !archived.length) return null;
    const canEdit = role === 'manager' || role === 'super' || C.can(role, 'preset', est.status);
    return (
      <div className="cc-pkgs-wrap">
        <div className="cc-pkgs-eyebrow">Пакеты услуг · из конструктора</div>
        <div className="cc-pkgs">
          {[...list, ...archived].map((p) => {
            const on = !!cur[p.id];
            const qty = on ? (cur[p.id].qty || 1) : 0;
            return (
              <span key={p.id} className={'cc-pkg' + (on ? ' on' : '') + (p.archived ? ' archived' : '')} style={{ '--pc': p.color }}>
                <button type="button" className="cc-pkg-main" disabled={!canEdit} title={p.desc || p.name} onClick={() => canEdit && setEst(C.togglePackage(est, p.id))}>
                  <span>{p.icon}</span>{p.name}
                  <span className="cc-pkg-n">{(p.steps || []).length} ш.</span>
                </button>
                {on && canEdit && (
                  <span className="cc-pkg-qty" title="Количество (например, два телевизора)">
                    <button type="button" disabled={qty <= 1} onClick={() => setEst(C.setPackageQty(est, p.id, qty - 1))} aria-label="Меньше">−</button>
                    <b>×{qty}</b>
                    <button type="button" onClick={() => setEst(C.setPackageQty(est, p.id, qty + 1))} aria-label="Больше">+</button>
                  </span>
                )}
                {on && !canEdit && qty > 1 && <span className="cc-pkg-qty ro"><b>×{qty}</b></span>}
              </span>
            );
          })}
        </div>
      </div>
    );
  }

  /* ── баннер предупреждений над деревом ── */
  function PackageWarnings({ est, catalog }) {
    const w = C.packageWarnings(est, catalog);
    if (!w.length) return null;
    return (
      <div className="cc-pkg-warn" role="status">
        {w.map((x, i) => (
          <div key={i} className={'cc-pkg-warn-row ' + x.level}>
            <Ic n={x.level === 'info' ? 'info' : 'alert-triangle'} s={13} />{x.text}
          </div>
        ))}
      </div>
    );
  }

  /* ── карточка виртуального этапа (слот пакетов в фазе) ── */
  function PkgStageCard({ slot, est, setEst, role, status, collapsed, onToggle }) {
    const open = !collapsed;
    const canInclude = C.can(role, 'include', status);
    const canPrice = C.can(role, 'clientPrice', status);
    let total = 0;
    slot.tasks.forEach((t) => { const s = C.nodeState(est, t); if (s.included) total += s.price * s.qty; });
    const patch = (t, p) => setEst({ ...est, nodes: { ...est.nodes, [t.id]: { ...(est.nodes[t.id] || {}), ...p } } });
    const RolePill = window.RolePill, MoneyChip = window.MoneyChip;
    return (
      <div className="cc-stage virtual">
        <div className="cc-stage-h" onClick={(e) => { if (e.target.closest('button,input,label,a')) return; onToggle(); }}>
          <button className={'cc-chev' + (open ? ' open' : '')} onClick={onToggle}><Ic n="chevron-right" s={16} /></button>
          <span className="cc-stage-name"><span className="cc-pkg-mark" style={{ background: slot.color }}>📦</span>{slot.name}</span>
          {slot.pkgs.map((p) => (
            <span key={p.id} className="cc-pill pkg ro" style={{ '--pc': p.color }} title={p.archived ? 'Пакет деактивирован в конструкторе' : 'Пакет услуг (из конструктора)'}>
              {p.icon} {p.name}{p.archived ? ' · архив' : ''}
            </span>
          ))}
          <span className="cc-stage-meta">{slot.tasks.length} шаг.</span>
          <MoneyChip v={Math.round(total)} strong title="Стоимость шагов пакетов в этом слоте" />
        </div>
        {open && (
          <div className="cc-lines">
            {slot.tasks.map((t) => {
              const s = C.nodeState(est, t);
              const qty = t.pkg.qty || 1;
              return (
                <div key={t.id} className={'cc-line task-row' + (s.included ? '' : ' off')}>
                  {t.required ? (
                    <span className="cc-locked-dot" title="Обязательный шаг пакета — выключите пакет целиком"><Ic n="check" s={12} /></span>
                  ) : (
                    <label className="cc-check" title={canInclude ? 'Включить / исключить необязательный шаг' : 'Только чтение в этой роли/статусе'}>
                      <input type="checkbox" checked={s.included} disabled={!canInclude} onChange={(e) => patch(t, { included: e.target.checked })} />
                    </label>
                  )}
                  <span className="cc-line-name">
                    <span className="cc-line-pkg" style={{ color: t.pkg.color }}>{t.pkg.icon} {t.pkg.name} · {t.stepNo}/{t.stepTotal}</span>
                    {t.name}
                    <RolePill roleId={t.role} />
                    {t.anchorFallback && <span className="cc-pill inc-cond ro" title={'Этап «' + (t.anchorWanted || '—') + '» не включён — шаг перенесён в конец фазы'}>⚠ перенесён</span>}
                    {t.checklistId && role !== 'client' && <span className="cc-pill cat ro" title="Чек-лист сдачи (из конструктора)">📋 чек-лист</span>}
                  </span>
                  <span className="cc-pill ro" title="Фиксированные дни шага × количество">{t.days * qty} раб.дн</span>
                  {qty > 1 && <span className="cc-pill ro">×{qty}</span>}
                  {s.included && (canPrice ? (
                    <span className="cc-num price" title="Цена шага для клиента">
                      <input type="number" min={0} step={100} value={s.price} onChange={(e) => patch(t, { price: Math.max(0, +e.target.value || 0) })} />
                      <span>₽</span>
                    </span>
                  ) : <MoneyChip v={s.price} title="Цена шага (read-only)" />)}
                  <span className="cc-line-total">{s.included ? C.rub(s.price * s.qty) + ' ₽' : '—'}</span>
                </div>
              );
            })}
          </div>
        )}
      </div>
    );
  }

  window.Calc2Pkg = { PackageChips, PackageWarnings, PkgStageCard };
})();
