/* calc2-assembly-panel.jsx — панель автосборки: пресеты, preview, undo, readiness */
(function () {
  const { useState } = React;
  const C = window.Calc2;
  const ASM = window.Calc2Assembly;
  const { Button } = window.DesignSystem_9e0a09;

  function AssemblyPanel({ est, setEst, role, dealId }) {
    const [pending, setPending] = useState(null);
    const [preview, setPreview] = useState(null);
    const [busy, setBusy] = useState(false);

    if (!ASM) return null;

    const intake = window.loadSiteIntake ? window.loadSiteIntake(dealId) : null;
    const requiresDesign = intake && intake.requiresDesign;
    const presets = ASM.loadPresets().filter((p) => p.visibility !== 'hidden');
    const canApply = (role === 'foreman' || role === 'manager' || role === 'super') && C.can(role, 'preset', est.status);
    const included = Object.values(est.nodes || {}).filter((n) => n && n.included).length;
    const readiness = ASM.computeReadiness(est, intake, {
      requiresDesign: !!requiresDesign,
      designKitApplied: false,
      foremanAck: false,
    });

    const openPreset = (slug) => {
      if (!canApply) return;
      const pv = ASM.previewCatalogPreset(slug, intake);
      if (included === 0) {
        runApply(slug, 'replace');
        return;
      }
      setPreview(pv);
      setPending(slug);
    };

    const runApply = (slug, mode) => {
      setBusy(true);
      try {
        const result = ASM.applyCatalogPreset(est, slug, mode, intake);
        setEst(result.estimate);
        setPending(null);
        setPreview(null);
      } catch (e) {
        alert(e.message || 'Ошибка apply');
      } finally {
        setBusy(false);
      }
    };

    const undo = () => {
      setEst(ASM.restoreSnapshot(est));
    };

    return (
      <div className="cc-assembly">
        <div className="cc-assembly-top">
          <div className="cc-assembly-readiness">
            <span className="cc-assembly-readiness-label">Готовность к отправке</span>
            <div className="cc-assembly-readiness-bar" aria-hidden="true">
              <span style={{ width: readiness.total + '%' }} />
            </div>
            <span className="cc-assembly-readiness-val">{readiness.total}%</span>
          </div>
          {included > 0 && (
            <span className="cc-assembly-stat">{included} поз. в смете</span>
          )}
          {ASM.hasSnapshot(dealId) && canApply && (
            <button type="button" className="cc-assembly-undo" disabled={busy} onClick={undo}>
              <Ic n="rotate-ccw" s={14} /> Отменить apply
            </button>
          )}
        </div>

        {canApply && (
          <div className="cc-assembly-presets" role="group" aria-label="Пресеты каталога">
            <span className="cc-assembly-presets-label">Применить пресет</span>
            <div className="cc-assembly-chips">
              {presets.map((p) => (
                <button
                  key={p.id || p.slug}
                  type="button"
                  className="cc-assembly-chip"
                  disabled={busy}
                  onClick={() => openPreset(p.slug)}
                >
                  {p.name}
                </button>
              ))}
            </div>
          </div>
        )}

        {pending && preview && (
          <div className="cc-assembly-dialog" role="dialog" aria-label="Применить пресет">
            <div className="cc-assembly-dialog-title">Пресет «{preview.presetName}»</div>
            <ul className="cc-assembly-dialog-stats">
              <li>+ {preview.taskCount} задач · {preview.stageCount} этапов</li>
              <li>+ {preview.roughBomCount} черновых материалов (из каталога)</li>
              <li>~ {C.rub(preview.workTotalRub)} ₽ работ · ~ {C.rub(preview.roughTotalRub)} ₽ черновых</li>
            </ul>
            <div className="cc-assembly-dialog-actions">
              <Button variant="primary" size="sm" disabled={busy} onClick={() => runApply(pending, 'merge')}>
                Добавить недостающее
              </Button>
              <Button variant="ghost" size="sm" disabled={busy} onClick={() => runApply(pending, 'replace')}>
                Заменить работы
              </Button>
              <Button variant="ghost" size="sm" disabled={busy} onClick={() => { setPending(null); setPreview(null); }}>
                Отмена
              </Button>
            </div>
          </div>
        )}

        {readiness.blockers.length > 0 && role === 'manager' && (
          <div className="cc-assembly-blockers">
            {readiness.blockers.map((b) => (
              <span key={b.code} className="cc-assembly-blocker"><Ic n="alert-circle" s={13} />{b.message}</span>
            ))}
          </div>
        )}
      </div>
    );
  }

  window.AssemblyPanel = AssemblyPanel;
})();
