// === Summary view ===
const { useState: useSummaryState } = React;

// Error boundary so a single malformed answer doesn't crash the whole summary
class SummaryItemBoundary extends React.Component {
  constructor(props) { super(props); this.state = { err: null }; }
  static getDerivedStateFromError(err) { return { err }; }
  componentDidCatch(err, info) { console.warn('Summary item error:', err, info); }
  render() {
    if (this.state.err) {
      return <span className="summary-empty">No se pudo mostrar esta respuesta. <button className="summary-edit" onClick={this.props.onEdit} style={{marginLeft: 8}}>Editar</button></span>;
    }
    return this.props.children;
  }
}

// === Task C1: valueToText helper ===
function summarizeAvailability(availability) {
  if (!availability) return '';
  const days = ['mon','tue','wed','thu','fri','sat','sun'];
  const dayLabels = { mon: 'L', tue: 'M', wed: 'X', thu: 'J', fri: 'V', sat: 'S', sun: 'D' };
  const parts = [];
  for (const d of days) {
    const blocks = availability[d] || [];
    if (blocks.length === 0) continue;
    const ranges = blocks.map(b => `${b.start}-${b.end}`).join(', ');
    parts.push(`${dayLabels[d]}: ${ranges}`);
  }
  return parts.join(' / ');
}

function valueToText(q, val) {
  if (val === undefined || val === null || val === '') return '';
  if (typeof val === 'string') return val;
  if (typeof val === 'number') return String(val);

  // Arrays
  if (Array.isArray(val)) {
    if (val.length === 0) return '';
    // Array of {q, a} (FAQ builder)
    if (typeof val[0] === 'object' && val[0]?.q) {
      return val.map(f => `• ${f.q}${f.a ? ` — ${f.a}` : ''}`).join('\n');
    }
    // Array of strings (chips, drag-order)
    if (typeof val[0] === 'string') {
      return val.join(', ');
    }
    // Array of callers (callers-list)
    if (typeof val[0] === 'object' && 'availability' in val[0]) {
      return val.map(c => {
        const slots = summarizeAvailability(c.availability);
        return `${c.name || '(sin nombre)'}${c.email ? ` <${c.email}>` : ''}${slots ? ` · ${slots}` : ''}`;
      }).join('\n');
    }
    // Array of routing items
    if (typeof val[0] === 'object' && 'intent' in val[0]) {
      return val.map(r => {
        const dest = r.kind === 'agent' ? r.agent : `${r.teamName}${r.teamEmail ? ` <${r.teamEmail}>` : ''}`;
        return `• ${r.intent} → ${dest}`;
      }).join('\n');
    }
    // Array of {label, body} (cards multi)
    if (typeof val[0] === 'object' && 'label' in val[0]) {
      return val.map(x => x.label).join(', ');
    }
    return val.map(x => JSON.stringify(x)).join(', ');
  }

  // Objects
  if (typeof val === 'object') {
    // {tag, sample} — ab choice
    if (val.tag && val.sample) return val.sample;
    // {label, body} — card choice
    if (val.label) return val.label + (val.body ? ` — ${val.body}` : '');
    // writing_style: toggles object
    if (q.kind === 'toggles' && Array.isArray(q.toggles)) {
      const parts = q.toggles
        .filter(t => val[t.id] === 'left' || val[t.id] === 'right')
        .map(t => `${t.title}: ${val[t.id] === 'left' ? t.left : t.right}`);
      if (Array.isArray(val.emojiList) && val.emojiList.length > 0) {
        parts.push(`Emojis: ${val.emojiList.join(' ')}`);
      }
      return parts.join('\n');
    }
    // identity fields: {name, role, tone, ...}
    if ('name' in val || 'role' in val) {
      return Object.entries(val)
        .filter(([, v]) => v)
        .map(([k, v]) => `${k}: ${v}`)
        .join(' · ');
    }
    // team-member-field: {name, email}
    if ('email' in val && 'name' in val) {
      return `${val.name || '(sin nombre)'}${val.email ? ` <${val.email}>` : ''}`;
    }
    // Schedule or other key-value
    const entries = Object.entries(val).filter(([, v]) => v);
    return entries.map(([k, v]) => `${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`).join(' · ');
  }

  return String(val);
}

// === Task C2: EditableText component ===
function EditableText({ initial, onSave, placeholder }) {
  const [editing, setEditing] = useSummaryState(false);
  const [value, setValue] = useSummaryState(initial || '');
  const textareaRef = React.useRef(null);

  React.useEffect(() => {
    if (editing && textareaRef.current) {
      textareaRef.current.focus();
      // Put cursor at end
      const len = textareaRef.current.value.length;
      textareaRef.current.setSelectionRange(len, len);
      // Autosize
      textareaRef.current.style.height = 'auto';
      textareaRef.current.style.height = textareaRef.current.scrollHeight + 'px';
    }
  }, [editing]);

  React.useEffect(() => {
    setValue(initial || '');
  }, [initial]);

  function commit() {
    setEditing(false);
    if (value !== initial) onSave(value);
  }
  function cancel() {
    setValue(initial || '');
    setEditing(false);
  }

  if (editing) {
    return (
      <textarea
        ref={textareaRef}
        className="summary-edit-input"
        value={value}
        placeholder={placeholder || ''}
        onChange={(e) => {
          setValue(e.target.value);
          // Autosize
          e.target.style.height = 'auto';
          e.target.style.height = e.target.scrollHeight + 'px';
        }}
        onBlur={commit}
        onKeyDown={(e) => {
          if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); commit(); }
          if (e.key === 'Escape') { e.preventDefault(); cancel(); }
        }}
      />
    );
  }
  const display = (initial && initial.trim().length > 0) ? initial : (placeholder || '(sin respuesta)');
  const isEmpty = !initial || initial.trim().length === 0;
  return (
    <div
      className={`summary-editable ${isEmpty ? 'is-empty' : ''}`}
      onClick={() => setEditing(true)}
      role="button"
      tabIndex={0}
      onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setEditing(true); } }}
    >
      {display.split('\n').map((line, i) => (
        <div key={i} className="summary-editable-line">{line}</div>
      ))}
      <div className="summary-editable-hint">✎ click para editar</div>
    </div>
  );
}

// === Task C3: Rewritten SummaryView ===
function SummaryView({ answers, questions, onEdit, onSend, onUpdateOverride }) {
  const visible = questions.filter(q => !q.condition || q.condition(answers));

  // Skip agent-intro and info-card questions in summary
  const summarized = visible.filter(q => q.kind !== 'agent-intro' && q.kind !== 'info-card');

  const bySection = {};
  summarized.forEach(q => {
    if (!bySection[q.section]) bySection[q.section] = { name: q.sectionName, items: [] };
    bySection[q.section].items.push(q);
  });

  return (
    <div className="summary">
      <h2>Tu agente, <em>listo para crearse</em></h2>
      <p className="summary-lead">Revisa y edita cualquier respuesta haciendo click sobre ella.</p>

      {Object.entries(bySection).map(([sec, data]) => (
        data.items.length > 0 && (
          <div key={sec} className="summary-section">
            <div className="summary-section-head">
              <h3>{sec}. {data.name}</h3>
            </div>
            {data.items.map((q, i) => {
              const overrideKey = q.id + '__summary_text';
              const override = answers[overrideKey];
              const derived = valueToText(q, answers[q.id]);
              const currentText = typeof override === 'string' ? override : derived;
              return (
                <div key={q.id} style={{ marginTop: i === 0 ? 6 : 16, paddingTop: i === 0 ? 0 : 14, borderTop: i === 0 ? 'none' : '1px solid var(--border)' }}>
                  <div className="summary-item-head">
                    <div className="summary-item-label">{stripTags(q.prompt).slice(0, 100)}</div>
                    {override !== undefined && (
                      <button
                        className="summary-edit"
                        onClick={() => onUpdateOverride(overrideKey, undefined)}
                        title="Volver a la respuesta original"
                      >Restaurar</button>
                    )}
                  </div>
                  <SummaryItemBoundary onEdit={() => onEdit(q.id)}>
                    <EditableText
                      initial={currentText}
                      placeholder={q.required ? 'Sin respuesta · requerida' : 'Sin respuesta'}
                      onSave={(v) => onUpdateOverride(overrideKey, v)}
                    />
                  </SummaryItemBoundary>
                </div>
              );
            })}
          </div>
        )
      ))}

      <div className="summary-cta">
        <div>
          <h4>Todo <em>listo</em></h4>
          <p>Al enviar, generaremos el prompt de sistema y la configuración inicial de tu agente.</p>
        </div>
        <button className="btn btn-send" onClick={onSend}>
          Crear mi agente
          <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
            <path d="M3 7h8M7 3l4 4-4 4" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
          </svg>
        </button>
      </div>
    </div>
  );
}

function stripTags(s) { return (s || '').replace(/<[^>]+>/g, ''); }

Object.assign(window, { SummaryView });
