// Comms module — comunicados · reconocimientos · encuestas
// Admin view with left category sidebar + Colaborador feed view
const { useState: _co_useState } = React;

// ─── Master data ─────────────────────────────────────────

const COMUNICADOS = [
  {
    id: 'CM-2026-042',
    title: 'Cierre del año fiscal 2026 — directrices contables',
    summary: 'Detalle de fechas clave para corte y consolidación financiera del primer semestre.',
    author: 'Carolina Restrepo',
    authorRole: 'Jefe de RRHH',
    initials: 'CR',
    audience: 'Toda la empresa',
    audienceTone: 'navy',
    publishedAt: '04/05/2026 09:30',
    state: 'publicado',
    seen: 712, total: 824,
    body: 'Recordamos a todo el equipo que el cierre fiscal del primer semestre será el 30 de junio. Toda factura o nota de gasto debe estar radicada antes del 25 de junio. Para más información…',
  },
  {
    id: 'CM-2026-041',
    title: 'Mantenimiento programado · trituradora 2 · sábado 10 de mayo',
    summary: 'Suspensión planificada de la línea industrial desde las 06:00 hasta las 14:00.',
    author: 'Luis Miguel Marín',
    authorRole: 'Líder de Aprovechamiento',
    initials: 'LM',
    audience: 'Área: Operaciones · Sede Cali',
    audienceTone: 'amber',
    publishedAt: '03/05/2026 16:42',
    state: 'publicado',
    seen: 47, total: 58,
    body: 'El sábado 10 de mayo se realizará mantenimiento preventivo programado de la trituradora industrial. Los turnos de clasificación de la mañana se reasignarán al turno nocturno…',
  },
  {
    id: 'CM-2026-040',
    title: 'Nuevo convenio con EPS Sura · descuentos en odontología',
    summary: 'Nuevo beneficio: 25% de descuento en tratamientos odontológicos para colaboradores y beneficiarios.',
    author: 'Patricia Gómez',
    authorRole: 'Coord. Bienestar',
    initials: 'PG',
    audience: 'Toda la empresa',
    audienceTone: 'navy',
    publishedAt: '01/05/2026 11:00',
    state: 'publicado',
    seen: 798, total: 824,
    body: 'A partir del 1 de mayo entra en vigor un nuevo convenio con EPS Sura que ofrece a colaboradores y sus beneficiarios un descuento del 25% en tratamientos odontológicos…',
  },
  {
    id: 'CM-2026-039',
    title: 'Actualización del Reglamento Interno de Trabajo',
    summary: 'Revisión periódica del RIT conforme a la Reforma Laboral 2025. Lectura obligatoria.',
    author: 'Carolina Restrepo',
    authorRole: 'Jefe de RRHH',
    initials: 'CR',
    audience: 'Toda la empresa',
    audienceTone: 'navy',
    publishedAt: '15/04/2026 09:00',
    state: 'publicado',
    seen: 824, total: 824,
    body: 'Tras la entrada en vigencia de la Reforma Laboral, hemos actualizado el Reglamento Interno de Trabajo. Te pedimos revisar el documento y firmar electrónicamente la constancia de lectura…',
  },
  {
    id: 'CM-2026-043',
    title: 'Convocatoria · jornada de bienestar trimestre Q2',
    summary: 'Borrador en revisión · pendiente de logística y agenda.',
    author: 'Patricia Gómez',
    authorRole: 'Coord. Bienestar',
    initials: 'PG',
    audience: 'Toda la empresa',
    audienceTone: 'navy',
    publishedAt: '—',
    state: 'borrador',
    seen: 0, total: 824,
    body: '',
  },
  {
    id: 'CM-2026-044',
    title: 'Apertura inscripciones · Programa de liderazgo emergente',
    summary: 'Programa interno de 6 meses dirigido a líderes en formación. Cierra inscripciones el 20/05.',
    author: 'Carolina Restrepo',
    authorRole: 'Jefe de RRHH',
    initials: 'CR',
    audience: 'Cargos: Líder · Coord. · Téc.',
    audienceTone: 'blue',
    publishedAt: '08/05/2026 09:00 (programado)',
    state: 'programado',
    seen: 0, total: 64,
    body: '',
  },
];

const STATE_COMM = {
  borrador:  { label: 'Borrador',   pill: 'navy' },
  programado:{ label: 'Programado', pill: 'amber-soft' },
  publicado: { label: 'Publicado',  pill: 'green' },
};

const VALUES = [
  { id: 'equipo',     label: 'Trabajo en equipo',  tone: 'blue',  icon: 'IconUsers' },
  { id: 'innov',      label: 'Innovación',         tone: 'amber', icon: 'IconRocket' },
  { id: 'servicio',   label: 'Servicio al cliente',tone: 'green', icon: 'IconStar' },
  { id: 'calidad',    label: 'Excelencia · calidad',tone: 'navy', icon: 'IconCheck' },
  { id: 'compromiso', label: 'Compromiso',         tone: 'rose',  icon: 'IconShield' },
  { id: 'integridad', label: 'Integridad',         tone: 'navy',  icon: 'IconShield' },
  { id: 'autocuidado',label: 'Autocuidado · SST',  tone: 'green', icon: 'IconShield' },
];

const valueById = (id) => VALUES.find(v => v.id === id);

const RECOGNITIONS = [
  {
    id: 'R-2026-118',
    from: { name: 'Luis Miguel Marín', initials: 'LM', role: 'Líder de Aprovechamiento' },
    to:   { name: 'María Fernanda López', initials: 'MF', role: 'Op. Aprovechamiento' },
    valueId: 'equipo',
    when: 'hace 2 horas',
    visibility: 'empresa',
    message: '¡Mil gracias María! Tu apoyo cubriendo el turno de Lina cuando se enfermó nos salvó la entrega del cliente Corona. La línea no se detuvo y nadie quedó sin almuerzo. Eso es Atica.',
    claps: 24, applauded: false,
  },
  {
    id: 'R-2026-117',
    from: { name: 'Carolina Restrepo', initials: 'CR', role: 'Jefe de RRHH' },
    to:   { name: 'Jorge Iván Patiño', initials: 'JP', role: 'Conductor' },
    valueId: 'autocuidado',
    when: 'hace 5 horas',
    visibility: 'empresa',
    message: 'Tres años seguidos sin un solo comparendo y sin un evento en ruta. Tu manejo defensivo y tu disciplina con los descansos son ejemplo. Gracias por cuidarte y cuidar a los demás en la vía.',
    claps: 41, applauded: true,
  },
  {
    id: 'R-2026-116',
    from: { name: 'Andrés Felipe Mejía', initials: 'AM', role: 'Operario de Clasificación' },
    to:   { name: 'Carlos Andrés Vélez', initials: 'CV', role: 'Operario de Clasificación' },
    valueId: 'compromiso',
    when: 'ayer',
    visibility: 'area',
    message: 'Carlos, nunca olvidaré cómo me enseñaste a leer la proceso de clasificación mi primera semana. Hoy ya saco lotes solos gracias a tu paciencia. Eres un crack.',
    claps: 18, applauded: false,
  },
  {
    id: 'R-2026-115',
    from: { name: 'Sandra Milena Ortiz', initials: 'SO', role: 'Coord. Compras' },
    to:   { name: 'Juan David Ruiz', initials: 'JR', role: 'Aux. Calidad' },
    valueId: 'innov',
    when: 'hace 2 días',
    visibility: 'empresa',
    message: 'La idea de Juan David de pre-clasificar los lotes de material entrante por densidad antes del muestreo nos ahorra ~40 min por turno. Pequeño cambio, impacto grande. Eso es innovación de piso.',
    claps: 67, applauded: true,
  },
  {
    id: 'R-2026-114',
    from: { name: 'Patricia Gómez', initials: 'PG', role: 'Coord. Bienestar' },
    to:   { name: 'Paula Valencia Ríos', initials: 'PV', role: 'Téc. Mantenimiento' },
    valueId: 'calidad',
    when: 'hace 3 días',
    visibility: 'empresa',
    message: 'Paula resolvió la falla intermitente del compresor en menos de una hora un domingo a las 11pm. Sin perder un solo lote. Disciplina y conocimiento del fierro al máximo nivel.',
    claps: 52, applauded: true,
  },
  {
    id: 'R-2026-113',
    from: { name: 'Luis Miguel Marín', initials: 'LM', role: 'Líder de Aprovechamiento' },
    to:   { name: 'Diego Andrés Toro', initials: 'DT', role: 'Aux. Aprovechamiento' },
    valueId: 'equipo',
    when: 'hace 4 días',
    visibility: 'area',
    message: 'Diego asume cualquier tarea sin pedir, ayuda al que lo necesita y nunca pierde la sonrisa. Eres el pegamento de la línea, parce.',
    claps: 33, applauded: false,
  },
];

const SURVEYS = [
  {
    id: 'EN-2026-008',
    title: 'Clima organizacional · Q2 2026',
    description: 'Encuesta semestral anónima para medir clima, liderazgo y ambiente laboral.',
    state: 'progreso',
    questions: 22, answered: 412, total: 824,
    closes: 'Cierra 31/05/2026',
    type: 'Anónima',
  },
  {
    id: 'EN-2026-007',
    title: 'Satisfacción con beneficios y EPS',
    description: 'Pulso rápido sobre los nuevos convenios de salud y odontología.',
    state: 'progreso',
    questions: 8, answered: 281, total: 824,
    closes: 'Cierra 15/05/2026',
    type: 'Anónima',
  },
  {
    id: 'EN-2026-006',
    title: 'Pulso semanal · Operaciones Cali',
    description: 'Estado de ánimo del equipo y carga percibida en la última semana.',
    state: 'progreso',
    questions: 5, answered: 78, total: 124,
    closes: 'Cierra cada viernes',
    type: 'Recurrente',
  },
  {
    id: 'EN-2026-005',
    title: 'Onboarding · ingresos abril 2026',
    description: 'Retroalimentación de los 12 ingresos del mes sobre el proceso.',
    state: 'cerrada',
    questions: 14, answered: 12, total: 12,
    closes: 'Cerrada el 30/04/2026',
    type: 'Por nombre',
  },
];

// ─── Root ────────────────────────────────────────────────

const Comms = () => {
  const [persona, setPersona] = _co_useState('admin'); // admin | colaborador
  const [section, setSection] = _co_useState('comunicados');
  const [editorOpen, setEditorOpen] = _co_useState(false);
  const [recogOpen, setRecogOpen]   = _co_useState(false);

  const counts = {
    comunicados: COMUNICADOS.length,
    reconocimientos: RECOGNITIONS.length,
    encuestas: SURVEYS.length,
  };

  return (
    <div className="main" data-screen-label="Comunicaciones">
      <div className="page-head">
        <div>
          <h1 className="page-title">Comunicaciones y Reconocimiento</h1>
          <div className="page-subtitle">
            <b>{COMUNICADOS.filter(c => c.state === 'publicado').length} comunicados activos</b> · {RECOGNITIONS.length} reconocimientos esta semana · 3 encuestas en curso
          </div>
        </div>
        <div className="to-view-toggle">
          <button className={persona === 'admin' ? 'active' : ''} onClick={() => setPersona('admin')}>
            <IconShield size={13} /> Vista RRHH
          </button>
          <button className={persona === 'colaborador' ? 'active' : ''} onClick={() => setPersona('colaborador')}>
            <IconUsers size={13} /> Vista colaborador
          </button>
        </div>
      </div>

      {persona === 'admin' ? (
        <div className="co-layout">
          <aside className="co-sidebar">
            <div className="muted-xs" style={{ padding: '4px 4px 8px' }}>Categorías</div>
            <button className={`co-side-item ${section === 'comunicados' ? 'active' : ''}`} onClick={() => setSection('comunicados')}>
              <IconMegaphone size={15} />
              <span style={{ flex: 1, textAlign: 'left' }}>Comunicados</span>
              <span className="co-side-count">{counts.comunicados}</span>
            </button>
            <button className={`co-side-item ${section === 'reconocimientos' ? 'active' : ''}`} onClick={() => setSection('reconocimientos')}>
              <IconStar size={15} />
              <span style={{ flex: 1, textAlign: 'left' }}>Reconocimientos</span>
              <span className="co-side-count">{counts.reconocimientos}</span>
            </button>
            <button className={`co-side-item ${section === 'encuestas' ? 'active' : ''}`} onClick={() => setSection('encuestas')}>
              <IconBarChart size={15} />
              <span style={{ flex: 1, textAlign: 'left' }}>Encuestas</span>
              <span className="co-side-count">{counts.encuestas}</span>
            </button>

            <div className="co-side-divider" />
            <button className="btn primary" style={{ width: '100%', justifyContent: 'center' }} onClick={() => {
              if (section === 'reconocimientos') setRecogOpen(true);
              else if (section === 'comunicados') setEditorOpen(true);
            }}>
              <IconPlus size={13} />
              {section === 'reconocimientos' ? 'Dar reconocimiento'
               : section === 'encuestas'      ? 'Nueva encuesta'
                                              : 'Nuevo comunicado'}
            </button>

            <div className="co-side-stats">
              <div className="muted-xs">Esta semana</div>
              <div className="co-side-stat-row">
                <span>Comunicados publicados</span>
                <b className="mono">3</b>
              </div>
              <div className="co-side-stat-row">
                <span>Apertura promedio</span>
                <b className="mono">87%</b>
              </div>
              <div className="co-side-stat-row">
                <span>Reconocimientos dados</span>
                <b className="mono">{RECOGNITIONS.length}</b>
              </div>
              <div className="co-side-stat-row">
                <span>Aplausos totales</span>
                <b className="mono">{RECOGNITIONS.reduce((a, r) => a + r.claps, 0)}</b>
              </div>
            </div>
          </aside>

          <div className="co-content">
            {section === 'comunicados'     && <CommsList onNew={() => setEditorOpen(true)} />}
            {section === 'reconocimientos' && <RecognitionsList onNew={() => setRecogOpen(true)} />}
            {section === 'encuestas'       && <SurveysList />}
          </div>
        </div>
      ) : (
        <CollaboratorFeed onRecog={() => setRecogOpen(true)} />
      )}

      {editorOpen && <ComunicadoEditor onClose={() => setEditorOpen(false)} />}
      {recogOpen  && <RecognitionModal onClose={() => setRecogOpen(false)} />}
    </div>
  );
};

// ─── Section: Comunicados ────────────────────────────────

const CommsList = ({ onNew }) => {
  const [filter, setFilter] = _co_useState('todos');
  const list = filter === 'todos' ? COMUNICADOS : COMUNICADOS.filter(c => c.state === filter);

  const counts = {
    todos:      COMUNICADOS.length,
    publicado:  COMUNICADOS.filter(c => c.state === 'publicado').length,
    programado: COMUNICADOS.filter(c => c.state === 'programado').length,
    borrador:   COMUNICADOS.filter(c => c.state === 'borrador').length,
  };

  return (
    <>
      <div className="sst-quickfilter">
        {[
          { id: 'todos',      label: 'Todos' },
          { id: 'publicado',  label: 'Publicados',  tone: 'green' },
          { id: 'programado', label: 'Programados', tone: 'amber' },
          { id: 'borrador',   label: 'Borradores' },
        ].map(o => (
          <button key={o.id} className={`sst-chip ${o.tone || ''} ${filter === o.id ? 'active' : ''}`} onClick={() => setFilter(o.id)}>
            {o.label} <span className="sst-chip-count">{counts[o.id]}</span>
          </button>
        ))}
        <div style={{ flex: 1 }} />
        <div className="ob-search" style={{ maxWidth: 280 }}>
          <IconSearch size={15} />
          <input placeholder="Buscar por título o autor…" />
        </div>
        <button className="btn primary" onClick={onNew}><IconPlus size={14} /> Nuevo comunicado</button>
      </div>

      <div className="co-comms-list">
        {list.map(c => <CommCard key={c.id} c={c} />)}
      </div>
    </>
  );
};

const CommCard = ({ c }) => {
  const s = STATE_COMM[c.state];
  const pct = c.total ? Math.round((c.seen / c.total) * 100) : 0;
  return (
    <div className={`co-comm-card ${c.state}`}>
      <div className="co-comm-head">
        <div className="doc-avatar" style={{ background: 'var(--navy-50)', color: 'var(--navy-800)', width: 36, height: 36, fontSize: 12 }}>{c.initials}</div>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div className="co-comm-title">{c.title}</div>
          <div className="muted" style={{ fontSize: 12, marginTop: 3 }}>
            <b style={{ color: 'var(--text)' }}>{c.author}</b> · {c.authorRole} · {c.publishedAt}
          </div>
        </div>
        <span className={`pill ${s.pill}`}>{s.label}</span>
      </div>

      <div className="co-comm-summary">{c.summary}</div>

      <div className="co-comm-foot">
        <span className={`co-aud-tag ${c.audienceTone}`}>
          <IconUsers size={12} /> {c.audience}
        </span>
        {c.state === 'publicado' && (
          <div className="co-comm-metrics">
            <div className="co-comm-metric-bar">
              <div className="co-comm-metric-fill" style={{ width: `${pct}%` }} />
            </div>
            <span className="co-comm-metric-val">
              <IconCheck size={11} /> visto por <b>{c.seen}</b> de {c.total} <span className="muted mono">· {pct}%</span>
            </span>
          </div>
        )}
        {c.state === 'borrador' && (
          <span className="muted" style={{ fontSize: 12 }}>
            <IconClock size={12} /> Sin publicar — guardado el {c.publishedAt === '—' ? 'hace 2 días' : c.publishedAt}
          </span>
        )}
        {c.state === 'programado' && (
          <span className="muted" style={{ fontSize: 12 }}>
            <IconClock size={12} /> Se enviará automáticamente
          </span>
        )}
        <div style={{ flex: 1 }} />
        <button className="link-btn" style={{ marginLeft: 0 }}>Editar</button>
        <button className="btn" style={{ padding: '5px 11px', fontSize: 12 }}><IconExternal size={13} /> Ver</button>
      </div>
    </div>
  );
};

// ─── Section: Reconocimientos ────────────────────────────

const RecognitionsList = ({ onNew }) => {
  const [filter, setFilter] = _co_useState('todos');
  const list = filter === 'todos' ? RECOGNITIONS : RECOGNITIONS.filter(r => r.valueId === filter);

  return (
    <>
      <div className="sst-quickfilter">
        <button className={`sst-chip ${filter === 'todos' ? 'active' : ''}`} onClick={() => setFilter('todos')}>
          Todos <span className="sst-chip-count">{RECOGNITIONS.length}</span>
        </button>
        {VALUES.slice(0, 5).map(v => (
          <button key={v.id} className={`sst-chip ${filter === v.id ? 'active' : ''}`} onClick={() => setFilter(v.id)}>
            {v.label}
          </button>
        ))}
        <div style={{ flex: 1 }} />
        <button className="btn primary" onClick={onNew}><IconPlus size={14} /> Dar reconocimiento</button>
      </div>

      <div className="co-recog-feed">
        {list.map(r => <RecogCard key={r.id} r={r} />)}
      </div>
    </>
  );
};

const RecogCard = ({ r }) => {
  const v = valueById(r.valueId);
  const VIco = window[v.icon] || IconStar;
  const [applauded, setApplauded] = _co_useState(r.applauded);
  const [count, setCount] = _co_useState(r.claps);
  const toggle = () => {
    setApplauded(a => !a);
    setCount(c => applauded ? c - 1 : c + 1);
  };
  return (
    <div className="co-recog-card">
      <div className="co-recog-head">
        <div className="co-recog-from-to">
          <div className="co-recog-avatar from">
            {r.from.initials}
            <span className="co-recog-avatar-tag">de</span>
          </div>
          <div className="co-recog-arrow">→</div>
          <div className="co-recog-avatar to">
            {r.to.initials}
            <span className="co-recog-avatar-tag">para</span>
          </div>
        </div>
        <div style={{ flex: 1, minWidth: 0 }}>
          <div className="co-recog-line">
            <b>{r.from.name}</b>
            <span className="muted" style={{ fontSize: 12 }}>reconoció a</span>
            <b>{r.to.name}</b>
          </div>
          <div className="muted" style={{ fontSize: 11.5, marginTop: 2 }}>
            {r.from.role} · {r.to.role} · {r.when}
          </div>
        </div>
        <span className={`co-value-badge ${v.tone}`}>
          <VIco size={12} /> {v.label}
        </span>
      </div>

      <div className="co-recog-msg">{r.message}</div>

      <div className="co-recog-foot">
        <button className={`co-clap ${applauded ? 'on' : ''}`} onClick={toggle}>
          <span className="co-clap-emoji">👏</span>
          <span className="mono">{count}</span>
          <span style={{ fontSize: 11.5 }}>{applauded ? 'Aplaudido' : 'Aplaudir'}</span>
        </button>
        <span className="co-vis-tag">
          <IconUsers size={11} /> {r.visibility === 'empresa' ? 'Toda la empresa' : 'Solo el área'}
        </span>
        <div style={{ flex: 1 }} />
        <button className="link-btn" style={{ marginLeft: 0 }}>Comentar</button>
      </div>
    </div>
  );
};

// ─── Section: Encuestas ──────────────────────────────────

const SurveysList = () => {
  return (
    <>
      <div className="sst-quickfilter">
        <span className="muted" style={{ fontSize: 12 }}>{SURVEYS.length} encuestas</span>
        <div style={{ flex: 1 }} />
        <button className="btn primary"><IconPlus size={14} /> Nueva encuesta</button>
      </div>
      <div className="co-survey-grid">
        {SURVEYS.map(s => {
          const pct = s.total ? Math.round((s.answered / s.total) * 100) : 0;
          return (
            <div key={s.id} className="co-survey-card">
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: 10 }}>
                <div>
                  <div className="muted mono" style={{ fontSize: 11 }}>{s.id}</div>
                  <div className="co-survey-title">{s.title}</div>
                </div>
                <span className={`pill ${s.state === 'progreso' ? 'amber-soft' : 'green'}`} style={{ fontSize: 11 }}>
                  {s.state === 'progreso' ? 'En curso' : 'Cerrada'}
                </span>
              </div>
              <div className="muted" style={{ fontSize: 12.5, marginTop: 6, lineHeight: 1.5 }}>{s.description}</div>

              <div className="co-survey-meta">
                <div><div className="muted-xs">Tipo</div><div className="co-survey-val">{s.type}</div></div>
                <div><div className="muted-xs">Preguntas</div><div className="co-survey-val mono">{s.questions}</div></div>
                <div><div className="muted-xs">Vencimiento</div><div className="co-survey-val mono" style={{ fontSize: 11.5 }}>{s.closes}</div></div>
              </div>

              <div>
                <div className="co-survey-prog-row">
                  <span className="muted-xs">Respuestas</span>
                  <span className="mono" style={{ fontSize: 12, fontWeight: 700 }}>
                    {s.answered} / {s.total} <span className="muted">· {pct}%</span>
                  </span>
                </div>
                <div className="tr-prog-track">
                  <div className={`tr-prog-fill ${pct >= 70 ? 'green' : pct >= 40 ? 'amber' : 'rose'}`} style={{ width: `${pct}%` }} />
                </div>
              </div>

              <div style={{ display: 'flex', gap: 8 }}>
                <button className="btn" style={{ flex: 1 }}><IconBarChart size={13} /> Resultados</button>
                <button className="btn primary" style={{ flex: 1 }}><IconExternal size={13} /> Gestionar</button>
              </div>
            </div>
          );
        })}
      </div>
    </>
  );
};

// ─── Modal: Editor de comunicado ─────────────────────────

const ComunicadoEditor = ({ onClose }) => {
  const [stage, setStage]     = _co_useState('edit'); // edit | preview
  const [title, setTitle]     = _co_useState('');
  const [body, setBody]       = _co_useState(`Buenas,

Queremos compartir una novedad importante:

`);
  const [audience, setAudience] = _co_useState('empresa');
  const [audienceFilter, setAF] = _co_useState('');
  const [selectedPeople, setSelectedPeople] = _co_useState([]);
  const [peopleQuery, setPeopleQuery] = _co_useState('');
  const [schedule, setSchedule] = _co_useState('inmediata');
  // Reference date: 2026-05-05 (proyecto)
  const _CO_TODAY = new Date(2026, 4, 5);
  const [schedDate, setSchedDate] = _co_useState(() => new Date(2026, 4, 8));
  const [schedH, setSchedH] = _co_useState(9);
  const [schedM, setSchedM] = _co_useState(0);
  const [calMonth, setCalMonth] = _co_useState({ y: 2026, m: 4 });

  const _CO_DOW    = ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'];
  const _CO_MONTHS = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
  const _CO_MONTHS_S = ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'];

  const _coSameDay = (a, b) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
  const _coIsBefore = (a, b) => {
    const aa = new Date(a.getFullYear(), a.getMonth(), a.getDate());
    const bb = new Date(b.getFullYear(), b.getMonth(), b.getDate());
    return aa < bb;
  };

  const _coBuildCells = () => {
    const first = new Date(calMonth.y, calMonth.m, 1);
    const startDow = first.getDay();
    const days = new Date(calMonth.y, calMonth.m + 1, 0).getDate();
    const cells = [];
    for (let i = 0; i < startDow; i++) cells.push(null);
    for (let d = 1; d <= days; d++) cells.push(new Date(calMonth.y, calMonth.m, d));
    while (cells.length % 7 !== 0) cells.push(null);
    return cells;
  };

  const _coPrevMonth = () => setCalMonth(p => p.m === 0 ? { y: p.y - 1, m: 11 } : { y: p.y, m: p.m - 1 });
  const _coNextMonth = () => setCalMonth(p => p.m === 11 ? { y: p.y + 1, m: 0 } : { y: p.y, m: p.m + 1 });

  const _coApplyPreset = (kind) => {
    if (kind === 'tomorrow') {
      const d = new Date(_CO_TODAY); d.setDate(d.getDate() + 1);
      setSchedDate(d); setSchedH(8); setSchedM(0); setCalMonth({ y: d.getFullYear(), m: d.getMonth() });
    } else if (kind === 'monday') {
      const d = new Date(_CO_TODAY);
      const dow = d.getDay();
      const delta = ((1 - dow + 7) % 7) || 7;
      d.setDate(d.getDate() + delta);
      setSchedDate(d); setSchedH(9); setSchedM(0); setCalMonth({ y: d.getFullYear(), m: d.getMonth() });
    } else if (kind === 'friday') {
      const d = new Date(_CO_TODAY);
      const dow = d.getDay();
      const delta = ((5 - dow + 7) % 7) || 7;
      d.setDate(d.getDate() + delta);
      setSchedDate(d); setSchedH(15); setSchedM(0); setCalMonth({ y: d.getFullYear(), m: d.getMonth() });
    }
  };

  const _coPad = (n) => String(n).padStart(2, '0');
  const scheduleAt = `${_CO_DOW[schedDate.getDay()]} ${schedDate.getDate()} ${_CO_MONTHS_S[schedDate.getMonth()]} ${schedDate.getFullYear()} · ${_coPad(schedH)}:${_coPad(schedM)}`;
  const scheduleAtShort = `${_coPad(schedDate.getDate())}/${_coPad(schedDate.getMonth() + 1)}/${schedDate.getFullYear()} ${_coPad(schedH)}:${_coPad(schedM)}`;

  const CO_PEOPLE = [
    { id: 'p1', name: 'Carolina Restrepo Vélez',  role: 'Coord. Calidad',         site: 'Cali',   initials: 'CR', color: 'navy' },
    { id: 'p2', name: 'Andrés Mejía Cardona',     role: 'Operario de Clasificación',    site: 'Cali',   initials: 'AM', color: 'navy' },
    { id: 'p3', name: 'Luisa Gómez Henao',        role: 'Op. Aprovechamiento',            site: 'Cali',   initials: 'LG', color: 'rose' },
    { id: 'p4', name: 'Juan Ramírez Ospina',      role: 'Aux. Calidad',           site: 'Barranquilla', initials: 'JR', color: 'navy' },
    { id: 'p5', name: 'Sofía Osorio Bedoya',      role: 'Coord. Comunicaciones',  site: 'Bogotá',    initials: 'SO', color: 'rose' },
    { id: 'p6', name: 'Camilo Vargas Toro',       role: 'Operario de Clasificación',    site: 'Cali',   initials: 'CV', color: 'navy' },
    { id: 'p7', name: 'María Fernanda Ríos',      role: 'Op. Aprovechamiento',            site: 'Cali',   initials: 'MF', color: 'rose' },
    { id: 'p8', name: 'Jorge Patiño Marín',       role: 'Conductor',              site: 'Barranquilla', initials: 'JP', color: 'navy' },
    { id: 'p9', name: 'Paula Vélez Castaño',      role: 'Téc. Mantenimiento',     site: 'Cali',   initials: 'PV', color: 'rose' },
    { id: 'p10', name: 'Diego Tabares Quintero',  role: 'Aux. Aprovechamiento',           site: 'Cali',   initials: 'DT', color: 'navy' },
    { id: 'p11', name: 'Nicolás Cardona Salazar', role: 'Conductor',              site: 'Barranquilla', initials: 'NC', color: 'navy' },
    { id: 'p12', name: 'Valentina Salgado Pérez', role: 'Líder de Aprovechamiento',       site: 'Cali',   initials: 'VS', color: 'rose' },
  ];

  const togglePerson = (id) => setSelectedPeople(prev =>
    prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id]
  );

  React.useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const audienceLabel = audience === 'empresa'   ? 'Toda la empresa · 824 colaboradores'
                      : audience === 'area'      ? `Área: ${audienceFilter || 'Operaciones'} · ~58 colaboradores`
                      : audience === 'cargo'     ? `Cargo: ${audienceFilter || 'Operario de Clasificación'} · ~12 colaboradores`
                      : audience === 'sede'      ? `Sede: ${audienceFilter || 'Cali'} · ~712 colaboradores`
                      :                            `Selección manual · ${selectedPeople.length} ${selectedPeople.length === 1 ? 'colaborador' : 'colaboradores'}`;

  return (
    <div className="modal-overlay" onMouseDown={(e) => { if (e.target === e.currentTarget) onClose(); }}>
      <div className="modal" style={{ maxWidth: 1080 }}>
        <div className="modal-head">
          <div>
            <div className="modal-title">{stage === 'edit' ? 'Nuevo comunicado' : 'Vista previa antes de publicar'}</div>
            <div className="modal-sub">
              {stage === 'edit'
                ? 'Componlo, segmenta destinatarios y programa el envío. Puedes guardar como borrador en cualquier momento.'
                : 'Así verán los destinatarios el comunicado. Si todo está bien, púbicalo o programa el envío.'
              }
            </div>
          </div>
          <button className="icon-btn" onClick={onClose} title="Cerrar">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12" /></svg>
          </button>
        </div>

        <div className="modal-body">
          {stage === 'edit' ? (
            <div className="co-editor-grid">
              {/* Editor */}
              <div className="co-editor-main">
                <input
                  className="co-editor-title"
                  placeholder="Título del comunicado"
                  value={title}
                  onChange={(e) => setTitle(e.target.value)}
                />
                <div className="co-editor-toolbar">
                  <button className="co-tb-btn" title="Negrita"><b>B</b></button>
                  <button className="co-tb-btn" title="Itálica"><i>I</i></button>
                  <button className="co-tb-btn" title="Subrayado"><u>U</u></button>
                  <span className="co-tb-sep" />
                  <button className="co-tb-btn" title="Encabezado">H1</button>
                  <button className="co-tb-btn" title="Lista"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01" /></svg></button>
                  <button className="co-tb-btn" title="Cita">"</button>
                  <span className="co-tb-sep" />
                  <button className="co-tb-btn" title="Insertar imagen"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><rect x="3" y="3" width="18" height="18" rx="2" /><circle cx="8.5" cy="8.5" r="1.5" /><path d="m21 15-5-5L5 21" /></svg></button>
                  <button className="co-tb-btn" title="Enlace"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-1 1M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l1-1" /></svg></button>
                </div>
                <textarea
                  className="co-editor-body"
                  rows={14}
                  value={body}
                  onChange={(e) => setBody(e.target.value)}
                  placeholder="Escribe el cuerpo del comunicado…"
                />
              </div>

              {/* Sidebar: audience & schedule */}
              <div className="co-editor-side">
                <div className="muted-xs">Destinatarios</div>
                <div className="co-aud-options">
                  {[
                    ['empresa', 'Toda la empresa',  '824 colaboradores'],
                    ['area',    'Por área',          '~58 según selección'],
                    ['cargo',   'Por cargo',         '~12 según selección'],
                    ['sede',    'Por sede',          '~712 según selección'],
                    ['persona', 'Por colaborador',   selectedPeople.length === 0 ? 'Selección manual' : `${selectedPeople.length} seleccionados`],
                  ].map(([k, l, h]) => (
                    <label key={k} className={`co-aud-option ${audience === k ? 'active' : ''}`}>
                      <input type="radio" name="aud" checked={audience === k} onChange={() => setAudience(k)} />
                      <div>
                        <div className="co-aud-label">{l}</div>
                        <div className="muted" style={{ fontSize: 11 }}>{h}</div>
                      </div>
                    </label>
                  ))}
                </div>

                {(audience === 'area' || audience === 'cargo' || audience === 'sede') && (
                  <div>
                    <label className="muted-xs">Filtro</label>
                    <select value={audienceFilter} onChange={(e) => setAF(e.target.value)}>
                      <option value="">Selecciona…</option>
                      {audience === 'area' && (<>
                        <option>Operaciones</option><option>Aprovechamiento</option><option>Calidad</option>
                        <option>Mantenimiento</option><option>Recolección</option><option>Administración</option>
                      </>)}
                      {audience === 'cargo' && (<>
                        <option>Operario de Clasificación</option><option>Op. Aprovechamiento</option>
                        <option>Líder de Aprovechamiento</option><option>Téc. Mantenimiento</option>
                        <option>Aux. Calidad</option><option>Conductor</option>
                      </>)}
                      {audience === 'sede' && (<>
                        <option>Cali</option><option>Barranquilla</option><option>Bogotá</option>
                      </>)}
                    </select>
                  </div>
                )}

                {audience === 'persona' && (
                  <div className="co-people-picker">
                    <div className="co-people-search">
                      <span className="icon"><IconSearch size={13} /></span>
                      <input
                        type="text"
                        placeholder="Buscar colaborador…"
                        value={peopleQuery}
                        onChange={(e) => setPeopleQuery(e.target.value)}
                      />
                    </div>
                    {selectedPeople.length > 0 && (
                      <div className="co-people-chips">
                        {selectedPeople.map(id => {
                          const p = CO_PEOPLE.find(x => x.id === id);
                          if (!p) return null;
                          return (
                            <span key={id} className="co-people-chip">
                              <span className={`co-chip-avatar ${p.color === 'rose' ? 'rose' : ''}`}>{p.initials}</span>
                              <span className="co-chip-name">{p.name.split(' ')[0]}</span>
                              <button type="button" onClick={() => togglePerson(id)} title="Quitar">
                                <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12" /></svg>
                              </button>
                            </span>
                          );
                        })}
                        <button type="button" className="co-people-clear" onClick={() => setSelectedPeople([])}>Limpiar</button>
                      </div>
                    )}
                    <div className="co-people-list">
                      {CO_PEOPLE
                        .filter(p => {
                          const q = peopleQuery.trim().toLowerCase();
                          if (!q) return true;
                          return p.name.toLowerCase().includes(q) || p.role.toLowerCase().includes(q) || p.site.toLowerCase().includes(q);
                        })
                        .map(p => {
                          const checked = selectedPeople.includes(p.id);
                          return (
                            <label key={p.id} className={`co-people-row ${checked ? 'active' : ''}`}>
                              <input type="checkbox" checked={checked} onChange={() => togglePerson(p.id)} />
                              <span className={`co-people-avatar ${p.color === 'rose' ? 'rose' : ''}`}>{p.initials}</span>
                              <span className="co-people-info">
                                <span className="co-people-name">{p.name}</span>
                                <span className="co-people-meta">{p.role} · {p.site}</span>
                              </span>
                            </label>
                          );
                        })}
                      {CO_PEOPLE.filter(p => {
                        const q = peopleQuery.trim().toLowerCase();
                        if (!q) return true;
                        return p.name.toLowerCase().includes(q) || p.role.toLowerCase().includes(q) || p.site.toLowerCase().includes(q);
                      }).length === 0 && (
                        <div className="co-people-empty">Sin resultados para "{peopleQuery}"</div>
                      )}
                    </div>
                  </div>
                )}

                <div className="co-aud-resolved">
                  <IconUsers size={12} />
                  <span>{audienceLabel}</span>
                </div>

                <div className="co-side-divider" />

                <div className="muted-xs">Publicación</div>
                <div className="co-sched">
                  <label className={`co-aud-option ${schedule === 'inmediata' ? 'active' : ''}`}>
                    <input type="radio" name="sch" checked={schedule === 'inmediata'} onChange={() => setSchedule('inmediata')} />
                    <div>
                      <div className="co-aud-label">Publicar ahora</div>
                      <div className="muted" style={{ fontSize: 11 }}>Notificación inmediata</div>
                    </div>
                  </label>
                  <label className={`co-aud-option ${schedule === 'programada' ? 'active' : ''}`}>
                    <input type="radio" name="sch" checked={schedule === 'programada'} onChange={() => setSchedule('programada')} />
                    <div>
                      <div className="co-aud-label">Programar envío</div>
                      <div className="muted" style={{ fontSize: 11 }}>Eligir fecha y hora</div>
                    </div>
                  </label>
                </div>

                {schedule === 'programada' && (
                  <div className="co-sched-picker">
                    {/* Quick presets */}
                    <div className="co-sched-presets">
                      {[
                        ['tomorrow', 'Mañana 8:00'],
                        ['monday',   'Próx. lunes 9:00'],
                        ['friday',   'Viernes 3:00 PM'],
                      ].map(([k, l]) => (
                        <button key={k} type="button" className="co-sched-preset" onClick={() => _coApplyPreset(k)}>
                          {l}
                        </button>
                      ))}
                    </div>

                    {/* Calendar */}
                    <div className="co-cal">
                      <div className="co-cal-head">
                        <button type="button" className="co-cal-nav" onClick={_coPrevMonth} title="Mes anterior">
                          <IconChevronLeft size={14} />
                        </button>
                        <div className="co-cal-month">
                          {_CO_MONTHS[calMonth.m]} {calMonth.y}
                        </div>
                        <button type="button" className="co-cal-nav" onClick={_coNextMonth} title="Mes siguiente">
                          <IconChevronRight size={14} />
                        </button>
                      </div>
                      <div className="co-cal-weekdays">
                        {['D', 'L', 'M', 'M', 'J', 'V', 'S'].map((w, i) => <span key={i}>{w}</span>)}
                      </div>
                      <div className="co-cal-grid">
                        {_coBuildCells().map((d, i) => {
                          if (!d) return <span key={i} className="co-cal-day empty" />;
                          const isPast     = _coIsBefore(d, _CO_TODAY);
                          const isToday    = _coSameDay(d, _CO_TODAY);
                          const isSelected = _coSameDay(d, schedDate);
                          const cls = ['co-cal-day'];
                          if (isPast)     cls.push('past');
                          if (isToday)    cls.push('today');
                          if (isSelected) cls.push('selected');
                          return (
                            <button
                              key={i}
                              type="button"
                              className={cls.join(' ')}
                              disabled={isPast}
                              onClick={() => setSchedDate(d)}
                            >
                              {d.getDate()}
                            </button>
                          );
                        })}
                      </div>
                    </div>

                    {/* Time picker */}
                    <div className="co-sched-time">
                      <div className="co-time-label">
                        <IconClock size={12} /> Hora
                      </div>
                      <div className="co-time-input">
                        <input
                          type="number"
                          min="0" max="23"
                          value={schedH}
                          onChange={(e) => {
                            const v = Math.max(0, Math.min(23, parseInt(e.target.value, 10) || 0));
                            setSchedH(v);
                          }}
                          aria-label="Hora"
                        />
                        <span className="co-time-sep">:</span>
                        <input
                          type="number"
                          min="0" max="59" step="5"
                          value={schedM}
                          onChange={(e) => {
                            const v = Math.max(0, Math.min(59, parseInt(e.target.value, 10) || 0));
                            setSchedM(v);
                          }}
                          aria-label="Minutos"
                        />
                      </div>
                      <div className="co-time-quick">
                        {[[8,0,'8:00'],[9,0,'9:00'],[12,0,'12:00'],[15,0,'15:00'],[17,0,'17:00']].map(([h,m,l]) => (
                          <button
                            key={l}
                            type="button"
                            className={`co-time-chip ${schedH===h && schedM===m ? 'active' : ''}`}
                            onClick={() => { setSchedH(h); setSchedM(m); }}
                          >
                            {l}
                          </button>
                        ))}
                      </div>
                    </div>

                    {/* Resolved */}
                    <div className="co-sched-summary">
                      <IconCalendar size={12} />
                      <span>{scheduleAt}</span>
                    </div>
                  </div>
                )}
              </div>
            </div>
          ) : (
            // Preview
            <div className="co-preview">
              <div className="co-preview-card">
                <div className="co-preview-head">
                  <div className="doc-avatar" style={{ background: 'var(--navy-50)', color: 'var(--navy-800)', width: 40, height: 40, fontSize: 13 }}>CR</div>
                  <div>
                    <div style={{ fontWeight: 700, fontSize: 13 }}>Carolina Restrepo</div>
                    <div className="muted" style={{ fontSize: 11.5 }}>Jefe de RRHH · {schedule === 'programada' ? scheduleAt + ' (programado)' : 'hace un momento'}</div>
                  </div>
                  <span className={`co-aud-tag navy`} style={{ marginLeft: 'auto' }}>
                    <IconUsers size={11} /> {audienceLabel}
                  </span>
                </div>
                <h2 className="co-preview-title">{title || 'Título del comunicado'}</h2>
                <div className="co-preview-body">
                  {body.split('\n').map((line, i) => <p key={i}>{line || <br />}</p>)}
                </div>
              </div>
            </div>
          )}
        </div>

        <div className="modal-foot">
          {stage === 'edit' ? (
            <>
              <span className="muted" style={{ fontSize: 12, marginRight: 'auto' }}>
                <IconCheck size={12} style={{ color: 'var(--green-600)' }} /> Borrador guardado automáticamente
              </span>
              <button className="btn" onClick={onClose}>Cancelar</button>
              <button className="btn">Guardar borrador</button>
              <button className="btn primary" onClick={() => setStage('preview')}>
                <IconExternal size={14} /> Vista previa
              </button>
            </>
          ) : (
            <>
              <button className="btn" onClick={() => setStage('edit')}>
                <IconChevronLeft size={14} /> Volver a editar
              </button>
              <div style={{ flex: 1 }} />
              <button className="btn">Guardar borrador</button>
              <button className="btn primary">
                <IconMegaphone size={14} /> {schedule === 'programada' ? 'Programar envío' : 'Publicar ahora'}
              </button>
            </>
          )}
        </div>
      </div>
    </div>
  );
};

// ─── Modal: Reconocimiento ───────────────────────────────

const PEOPLE_PICK = [
  { initials: 'AM', name: 'Andrés Felipe Mejía',  role: 'Operario de Clasificación', site: 'Cali' },
  { initials: 'CV', name: 'Carlos Andrés Vélez',  role: 'Operario de Clasificación', site: 'Cali' },
  { initials: 'MF', name: 'María Fernanda López', role: 'Op. Aprovechamiento',          site: 'Cali' },
  { initials: 'JP', name: 'Jorge Iván Patiño',    role: 'Conductor',            site: 'Barranquilla' },
  { initials: 'PV', name: 'Paula Valencia Ríos',  role: 'Téc. Mantenimiento',   site: 'Cali' },
  { initials: 'LM', name: 'Luis Miguel Marín',    role: 'Líder de Aprovechamiento',     site: 'Cali' },
  { initials: 'NC', name: 'Nicolás Cárdenas',     role: 'Conductor',            site: 'Barranquilla' },
];

const RecognitionModal = ({ onClose }) => {
  const [q, setQ]               = _co_useState('');
  const [picked, setPicked]     = _co_useState(null);
  const [valueId, setValueId]   = _co_useState('');
  const [message, setMessage]   = _co_useState('');
  const [visibility, setVis]    = _co_useState('empresa');

  React.useEffect(() => {
    document.body.style.overflow = 'hidden';
    const onEsc = (e) => { if (e.key === 'Escape') onClose(); };
    window.addEventListener('keydown', onEsc);
    return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onEsc); };
  }, []);

  const opts = q
    ? PEOPLE_PICK.filter(p => p.name.toLowerCase().includes(q.toLowerCase()) || p.role.toLowerCase().includes(q.toLowerCase()))
    : PEOPLE_PICK.slice(0, 5);

  const canSend = picked && valueId && message.trim().length > 12;

  return (
    <div className="modal-overlay" onMouseDown={(e) => { if (e.target === e.currentTarget) onClose(); }}>
      <div className="modal" style={{ maxWidth: 720 }}>
        <div className="modal-head">
          <div>
            <div className="modal-title">Dar un reconocimiento</div>
            <div className="modal-sub">Reconocer en público es la forma más simple de subir el ánimo del equipo. No te demores en hacerlo.</div>
          </div>
          <button className="icon-btn" onClick={onClose} title="Cerrar">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12" /></svg>
          </button>
        </div>

        <div className="modal-body">
          <div className="co-recog-form">
            <div>
              <label className="muted-xs">¿A quién quieres reconocer?</label>
              {picked ? (
                <div className="co-recog-picked">
                  <div className="doc-avatar" style={{ background: 'var(--navy-50)', color: 'var(--navy-800)', width: 36, height: 36, fontSize: 12 }}>{picked.initials}</div>
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ fontWeight: 700, fontSize: 13.5 }}>{picked.name}</div>
                    <div className="muted" style={{ fontSize: 12 }}>{picked.role} · {picked.site}</div>
                  </div>
                  <button className="link-btn" onClick={() => setPicked(null)}>Cambiar</button>
                </div>
              ) : (
                <>
                  <div className="ob-search" style={{ width: '100%', maxWidth: 'none' }}>
                    <IconSearch size={15} />
                    <input value={q} onChange={(e) => setQ(e.target.value)} placeholder="Buscar por nombre o cargo…" autoFocus />
                  </div>
                  <div className="co-recog-options">
                    {opts.map(p => (
                      <button key={p.name} className="co-recog-opt" onClick={() => setPicked(p)}>
                        <div className="doc-avatar" style={{ background: 'var(--navy-50)', color: 'var(--navy-800)', width: 30, height: 30, fontSize: 11 }}>{p.initials}</div>
                        <div style={{ flex: 1, textAlign: 'left' }}>
                          <div style={{ fontSize: 12.5, fontWeight: 600 }}>{p.name}</div>
                          <div className="muted" style={{ fontSize: 11 }}>{p.role} · {p.site}</div>
                        </div>
                        <IconPlus size={12} />
                      </button>
                    ))}
                  </div>
                </>
              )}
            </div>

            <div>
              <label className="muted-xs">¿Qué valor estás reconociendo?</label>
              <div className="co-value-grid">
                {VALUES.map(v => {
                  const VIco = window[v.icon] || IconStar;
                  return (
                    <button
                      key={v.id}
                      className={`co-value-pick ${v.tone} ${valueId === v.id ? 'active' : ''}`}
                      onClick={() => setValueId(v.id)}
                    >
                      <VIco size={13} /> {v.label}
                    </button>
                  );
                })}
              </div>
            </div>

            <div>
              <label className="muted-xs">Mensaje · sé específico, cuenta el momento concreto</label>
              <textarea
                rows={5}
                value={message}
                onChange={(e) => setMessage(e.target.value)}
                placeholder='Ej: "Cuando pasó X, lo que hiciste me ayudó a…"'
                className="co-recog-msg-input"
              />
              <div className="muted" style={{ fontSize: 11.5, marginTop: 4 }}>
                Mínimo 12 caracteres · {message.length} / 500
              </div>
            </div>

            <div>
              <label className="muted-xs">Visibilidad</label>
              <div className="furat-segment">
                <button className={`furat-seg ${visibility === 'empresa' ? 'active navy' : ''}`} onClick={() => setVis('empresa')}>
                  <IconUsers size={12} /> Toda la empresa
                </button>
                <button className={`furat-seg ${visibility === 'area' ? 'active navy' : ''}`} onClick={() => setVis('area')}>
                  Solo el área
                </button>
                <button className={`furat-seg ${visibility === 'directo' ? 'active navy' : ''}`} onClick={() => setVis('directo')}>
                  Solo a la persona
                </button>
              </div>
            </div>
          </div>
        </div>

        <div className="modal-foot">
          <span className="muted" style={{ fontSize: 12, marginRight: 'auto' }}>
            <IconStar size={12} style={{ color: 'var(--amber-600)' }} /> Los reconocimientos quedan en el muro y en la ficha del colaborador
          </span>
          <button className="btn" onClick={onClose}>Cancelar</button>
          <button className="btn primary" disabled={!canSend}>
            <IconStar size={14} /> Publicar reconocimiento
          </button>
        </div>
      </div>
    </div>
  );
};

// ─── Colaborador feed ────────────────────────────────────

const CollaboratorFeed = ({ onRecog }) => {
  // Combine and order by recency (mock — comunicados first half, recogs interspersed)
  const FEED = [
    { kind: 'recog', data: RECOGNITIONS[0] },
    { kind: 'comm',  data: COMUNICADOS[0], unread: true },
    { kind: 'recog', data: RECOGNITIONS[1] },
    { kind: 'comm',  data: COMUNICADOS[1], unread: true },
    { kind: 'recog', data: RECOGNITIONS[2] },
    { kind: 'comm',  data: COMUNICADOS[2], unread: false },
    { kind: 'recog', data: RECOGNITIONS[3] },
    { kind: 'recog', data: RECOGNITIONS[4] },
    { kind: 'comm',  data: COMUNICADOS[3], unread: false },
    { kind: 'recog', data: RECOGNITIONS[5] },
  ];

  return (
    <div className="co-collab">
      <div className="co-collab-feed">
        <div className="co-collab-feed-head">
          <div>
            <h2 style={{ fontSize: 18, fontWeight: 700, margin: 0 }}>Para ti, Carlos</h2>
            <div className="muted" style={{ fontSize: 13, marginTop: 2 }}>
              {FEED.filter(f => f.kind === 'comm' && f.unread).length} comunicados sin leer · feed actualizado hace 2 minutos
            </div>
          </div>
          <button className="btn primary" onClick={onRecog}>
            <IconStar size={14} /> Dar reconocimiento
          </button>
        </div>

        {FEED.map((f, i) => f.kind === 'comm' ? (
          <CollabCommItem key={i} c={f.data} unread={f.unread} />
        ) : (
          <CollabRecogItem key={i} r={f.data} />
        ))}
      </div>

      <aside className="co-collab-side">
        <div className="co-collab-card">
          <div className="muted-xs">Tu actividad este mes</div>
          <div className="co-collab-stat">
            <div>
              <div className="co-collab-stat-num">5</div>
              <div className="muted" style={{ fontSize: 11.5 }}>Reconocimientos recibidos</div>
            </div>
            <div>
              <div className="co-collab-stat-num">3</div>
              <div className="muted" style={{ fontSize: 11.5 }}>Reconocimientos dados</div>
            </div>
          </div>
        </div>

        <div className="co-collab-card">
          <div className="muted-xs" style={{ marginBottom: 8 }}>Encuestas pendientes</div>
          {SURVEYS.filter(s => s.state === 'progreso').map(s => (
            <div key={s.id} className="co-collab-survey">
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ fontSize: 12.5, fontWeight: 600 }}>{s.title}</div>
                <div className="muted mono" style={{ fontSize: 10.5, marginTop: 2 }}>{s.questions} preguntas · {s.closes}</div>
              </div>
              <button className="btn primary" style={{ padding: '5px 11px', fontSize: 12 }}>Responder</button>
            </div>
          ))}
        </div>

        <div className="co-collab-card">
          <div className="muted-xs" style={{ marginBottom: 8 }}>Top valores reconocidos</div>
          {VALUES.slice(0, 4).map(v => {
            const count = RECOGNITIONS.filter(r => r.valueId === v.id).length;
            const pct = count ? (count / RECOGNITIONS.length) * 100 : 0;
            return (
              <div key={v.id} className="co-top-value">
                <div className="co-top-value-row">
                  <span className={`co-value-dot ${v.tone}`} />
                  <span style={{ flex: 1, fontSize: 12 }}>{v.label}</span>
                  <span className="mono" style={{ fontSize: 11, fontWeight: 700 }}>{count}</span>
                </div>
                <div className="tr-prog-track" style={{ marginTop: 4 }}>
                  <div className={`tr-prog-fill ${v.tone === 'green' ? 'green' : 'amber'}`} style={{ width: `${pct}%` }} />
                </div>
              </div>
            );
          })}
        </div>
      </aside>
    </div>
  );
};

const CollabCommItem = ({ c, unread }) => {
  return (
    <div className={`co-feed-item co-feed-comm ${unread ? 'unread' : ''}`}>
      <div className="co-feed-marker"><IconMegaphone size={14} /></div>
      <div style={{ flex: 1, minWidth: 0 }}>
        <div className="co-feed-head">
          <div className="doc-avatar" style={{ background: 'var(--navy-50)', color: 'var(--navy-800)', width: 30, height: 30, fontSize: 11 }}>{c.initials}</div>
          <div style={{ minWidth: 0 }}>
            <div style={{ fontWeight: 700, fontSize: 12.5 }}>{c.author}</div>
            <div className="muted" style={{ fontSize: 11, marginTop: 1 }}>{c.authorRole} · publicó un comunicado · {c.publishedAt}</div>
          </div>
          {unread && <span className="co-unread-tag">No leído</span>}
        </div>
        <div className="co-feed-comm-title">{c.title}</div>
        <div className="co-feed-comm-summary">{c.summary}</div>
        <div style={{ display: 'flex', alignItems: 'center', gap: 10, paddingTop: 10, borderTop: '1px dashed var(--border)' }}>
          <span className={`co-aud-tag ${c.audienceTone}`}>
            <IconUsers size={11} /> {c.audience}
          </span>
          <div style={{ flex: 1 }} />
          <button className="btn" style={{ padding: '5px 11px', fontSize: 12 }}>
            <IconExternal size={13} /> Leer comunicado
          </button>
        </div>
      </div>
    </div>
  );
};

const CollabRecogItem = ({ r }) => {
  const v = valueById(r.valueId);
  const VIco = window[v.icon] || IconStar;
  const [applauded, setApplauded] = _co_useState(r.applauded);
  const [count, setCount] = _co_useState(r.claps);
  return (
    <div className="co-feed-item co-feed-recog">
      <div className="co-feed-marker amber"><IconStar size={14} /></div>
      <div style={{ flex: 1, minWidth: 0 }}>
        <div className="co-feed-head">
          <div className="co-recog-from-to" style={{ marginRight: 0 }}>
            <div className="co-recog-avatar from sm">{r.from.initials}</div>
            <div className="co-recog-arrow sm">→</div>
            <div className="co-recog-avatar to sm">{r.to.initials}</div>
          </div>
          <div style={{ minWidth: 0, flex: 1 }}>
            <div style={{ fontSize: 12.5 }}><b>{r.from.name}</b> <span className="muted">reconoció a</span> <b>{r.to.name}</b></div>
            <div className="muted" style={{ fontSize: 11, marginTop: 1 }}>{r.when}</div>
          </div>
          <span className={`co-value-badge ${v.tone}`}>
            <VIco size={11} /> {v.label}
          </span>
        </div>
        <div className="co-feed-recog-msg">{r.message}</div>
        <div style={{ display: 'flex', alignItems: 'center', gap: 10, paddingTop: 10, borderTop: '1px dashed var(--border)' }}>
          <button className={`co-clap ${applauded ? 'on' : ''}`} onClick={() => { setApplauded(a => !a); setCount(c => applauded ? c - 1 : c + 1); }}>
            <span className="co-clap-emoji">👏</span>
            <span className="mono">{count}</span>
            <span style={{ fontSize: 11.5 }}>{applauded ? 'Aplaudido' : 'Aplaudir'}</span>
          </button>
          <span className="co-vis-tag">
            <IconUsers size={11} /> {r.visibility === 'empresa' ? 'Toda la empresa' : 'Solo el área'}
          </span>
        </div>
      </div>
    </div>
  );
};

window.Comms = Comms;
window.COMUNICADOS = COMUNICADOS;
window.STATE_COMM = STATE_COMM;
