/* calc2-cross-rules-panel.jsx — «⇄ Перекрёстные работы»: список сработавших перекрёстных правил (X2:
   lk/calc2-cross-rules.js), что каждое добавило в смету (работы по этапам · пункты чек-листа), причина
   срабатывания и снять/вернуть. Применение правил — Calc2CrossRules.apply(), запускается эффектом в
   calc2-app.jsx App; сам компонент — только чтение состояния est.crossRules и кнопки dismiss/restore.
   Показывается над составом работ: в мастере (calc2-wizard.jsx, рядом с IntakeRulesStrip) и на вкладке
   «Состав» в calc2-app.jsx. window.Calc2CrossRulesPanel({ est, setEst, catalog, intake, dealId, role }) */
(function () {
  const CD = window.ConstructorData;
  const C = window.Calc2;
  const { Ic, LKSection } = window;

  function stageName(catalog, stageId) {
    let name = stageId;
    (catalog || []).forEach((ph) => (ph.stages || []).forEach((st) => { if (st.id === stageId) name = st.name; }));
    return name;
  }
  function dirLabel(role) {
    const dirs = (CD && CD.CROSS_DIRECTIONS) || [];
    const found = dirs.find((d) => d.id === role);
    return found ? found.label : (role || '—');
  }
  // «что добавлено» — строки по действиям правила (work: <название> · <направление> · <этап>; check: пункт в «<узел>»: <текст>)
  function addedLines(rule, catalog) {
    const lines = [];
    (rule.then || []).forEach((a) => {
      if (a.type === 'work') {
        const ph = (catalog || [])[+a.phase || 0];
        const st = a.mode === 'end' ? 'в конце «' + (ph ? ph.name : 'фазы ' + (+a.phase || 0)) + '»' : stageName(catalog, a.stageId);
        lines.push({ kind: 'work', text: a.name + ' · ' + dirLabel(a.role) + ' · ' + st });
      } else if (a.type === 'check') {
        lines.push({ kind: 'check', text: 'пункт в «' + stageName(catalog, a.nodeId) + '»: ' + a.text });
      }
    });
    return lines;
  }

  function Row({ rule, catalog, tone, reason, sameAsName, onDismiss, onRestore, canEdit }) {
    const lines = tone === 'applied' ? addedLines(rule, catalog) : [];
    return (
      <div className="cc-xr-row" style={{ padding: '10px 0', borderTop: '1px solid var(--border)' }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>
          <span style={{ fontWeight: 700 }}>{rule.name}</span>
          {tone === 'dismissed' && <span className="cc-pill cat">снято вручную</span>}
          {tone === 'gone' && <span className="cc-pill inc-cond">снято: условие больше не выполняется</span>}
          {sameAsName && <span className="cc-pill cat">уже добавлено правилом «{sameAsName}»</span>}
          <span style={{ flex: 1 }} />
          {canEdit && tone === 'applied' && !sameAsName && (
            <button type="button" className="chip" onClick={onDismiss}><Ic n="x" s={12} />Снять</button>
          )}
          {canEdit && tone === 'dismissed' && (
            <button type="button" className="chip" onClick={onRestore}><Ic n="rotate-ccw" s={12} />Вернуть</button>
          )}
        </div>
        {lines.length > 0 && (
          <ul style={{ margin: '6px 0 0', padding: '0 0 0 18px', fontSize: 12.5, color: 'var(--text-secondary)' }}>
            {lines.map((l, i) => <li key={i}>{l.text}</li>)}
          </ul>
        )}
        {reason && <div style={{ marginTop: 4, fontSize: 12, color: 'var(--text-tertiary)' }}>из-за: {reason}</div>}
      </div>
    );
  }

  function Calc2CrossRulesPanel({ est, setEst, catalog, intake, dealId, role }) {
    const CR = window.Calc2CrossRules;
    if (!CR || !CD || !CD.loadCrossRules) return null;
    const rules = CD.loadCrossRules();
    const byId = {};
    rules.forEach((r) => { byId[r.id] = r; });
    const cross = est.crossRules || { applied: {}, dismissed: {}, gone: {} };
    const appliedIds = Object.keys(cross.applied || {}).filter((id) => byId[id]);
    const dismissedIds = Object.keys(cross.dismissed || {}).filter((id) => byId[id] && !cross.applied[id]);
    const goneIds = Object.keys(cross.gone || {}).filter((id) => byId[id] && !cross.applied[id] && !cross.dismissed[id]);
    const n = appliedIds.filter((id) => !cross.applied[id].sameAs).length;
    if (n === 0 && dismissedIds.length === 0 && goneIds.length === 0) return null;

    const locked = C && C.isLocked ? C.isLocked(est.status) : false;
    const canEdit = role !== 'client' && !locked;
    const dismiss = (id) => setEst((cur) => CR.dismiss(cur, catalog, id));
    const restore = (id) => setEst((cur) => CR.restore(cur, catalog, id));

    const body = (
      <div>
        {appliedIds.map((id) => {
          const rec = cross.applied[id];
          const sameAsName = rec.sameAs ? (byId[rec.sameAs] ? byId[rec.sameAs].name : rec.sameAs) : null;
          return (
            <Row key={id} rule={byId[id]} catalog={catalog} tone="applied" reason={rec.reason} sameAsName={sameAsName}
              canEdit={canEdit} onDismiss={() => dismiss(id)} />
          );
        })}
        {dismissedIds.map((id) => (
          <Row key={id} rule={byId[id]} catalog={catalog} tone="dismissed" canEdit={canEdit} onRestore={() => restore(id)} />
        ))}
        {goneIds.map((id) => (
          <Row key={id} rule={byId[id]} catalog={catalog} tone="gone" canEdit={canEdit} />
        ))}
      </div>
    );

    if (LKSection) {
      return (
        <LKSection icon="arrow-left-right" title={'Перекрёстные работы · ' + n} sub="из условий анкеты, спецификации ДП и параметров объекта" style={{ marginBottom: 16 }}>
          {body}
        </LKSection>
      );
    }
    return (
      <div className="cc-xr-panel" style={{ marginBottom: 16 }}>
        <div style={{ display: 'flex', alignItems: 'center', gap: 7, fontWeight: 800, marginBottom: 4 }}><Ic n="arrow-left-right" s={15} />Перекрёстные работы · {n}</div>
        {body}
      </div>
    );
  }

  window.Calc2CrossRulesPanel = Calc2CrossRulesPanel;
})();
