const { Card, Eyebrow, SectionHeading, SourceNote, Callout, Badge } = window.CensoNosaraDesignSystem_f123a0;

/* Mapa de la toponimia del distrito.
 *
 * La capa por defecto son los nombres originarios. Los desarrollos
 * inmobiliarios están detrás de un interruptor: no se ocultan (eso sería
 * editorializar por omisión) pero tampoco se mezclan, porque son cosas
 * distintas, un caserío y un condominio no son la misma clase de lugar.
 *
 * La clasificación no la inventa el sitio: sale del campo DESCRIPC del
 * Instituto Geográfico Nacional. Cada punto declara su razón al tocarlo.
 */

const COLOR = {
  o: 'var(--cn-navy-700)',
  d: 'var(--cn-red-600)',
  r: 'var(--cn-ink-400)'
};
const NOMBRE_CLASE = {
  o: 'Nombre originario',
  d: 'Desarrollo inmobiliario',
  r: 'Sin resolver'
};

function Punto({ p, activo, onTocar }) {
  const esOriginaria = p.c === 'o';
  return (
    <g style={{ cursor: 'pointer' }} onClick={() => onTocar(activo ? null : p)}
      tabIndex={0} role="button" aria-label={p.n + ', ' + NOMBRE_CLASE[p.c]}
      onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onTocar(activo ? null : p); } }}>
      <circle cx={p.x} cy={p.y} r={activo ? 11 : 6.5} fill={COLOR[p.c]}
        stroke="var(--cn-cream-100)" strokeWidth={activo ? 3 : 2}
        style={{ transition: 'r var(--motion-hover)' }} />
      <text x={p.x + 13} y={p.y + 5.5} fontSize={esOriginaria ? 19 : 17}
        fontFamily="var(--font-display)" fontWeight={esOriginaria ? 600 : 500}
        fill={activo ? COLOR[p.c] : 'var(--cn-navy-700)'}
        opacity={esOriginaria ? 1 : 0.75}
        style={{ paintOrder: 'stroke', stroke: 'var(--cn-cream-100)', strokeWidth: 4 }}>
        {p.n}
      </text>
    </g>
  );
}

window.Mapa = function Mapa() {
  const M = window.CN_MAPA;
  const [verDesarrollos, setVerDesarrollos] = React.useState(false);
  const [sel, setSel] = React.useState(null);
  if (!M) return null;

  const fuera = M.puntos.filter(p => p.fuera);
  const dentro = M.puntos.filter(p => !p.fuera);
  const originarias = dentro.filter(p => p.c === 'o');
  const desarrollos = dentro.filter(p => p.c === 'd');
  const dudosos = dentro.filter(p => p.c === 'r');

  const visibles = [
    ...originarias,
    ...(verDesarrollos ? desarrollos : []),
    ...dudosos
  ];

  const Interruptor = ({ activo, onCambiar, color, children }) => (
    <button type="button" role="switch" aria-checked={activo} onClick={() => onCambiar(!activo)}
      style={{
        display: 'inline-flex', alignItems: 'center', gap: 'var(--space-3)',
        padding: '9px 16px', borderRadius: 'var(--radius-pill)', cursor: 'pointer',
        border: 'var(--border-width-thick) solid ' + (activo ? color : 'var(--border-default)'),
        background: activo ? color : 'transparent',
        color: activo ? 'var(--cn-white)' : 'var(--cn-navy-700)',
        fontFamily: 'var(--font-display)', fontWeight: 600, fontSize: 'var(--fs-xs)',
        minHeight: 40, transition: 'background var(--motion-hover),border-color var(--motion-hover)'
      }}>
      <span aria-hidden="true" style={{
        width: 9, height: 9, borderRadius: '50%', flex: 'none',
        background: activo ? 'var(--cn-white)' : color
      }} />
      {children}
    </button>
  );

  return (
    <section id="mapa-localidades" style={{ background: 'var(--surface-page)' }}>
      <div style={{ maxWidth: 'var(--container-wide)', margin: '0 auto', padding: 'var(--section-y) var(--gutter)' }}>
        <SectionHeading
          eyebrow="Toponimia del distrito"
          title="Cómo se llaman de verdad los lugares de Nosara"
          lede={'Los nombres originarios del distrito: caseríos, poblados, barrios y calles que la gente usa para decir de dónde es. Aparte, y sólo si usted los pide, los ' + desarrollos.length + ' nombres que pusieron los desarrollos inmobiliarios.'} />

        <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--space-3)', marginBottom: 'var(--space-6)' }}>
          <Interruptor activo={verDesarrollos} onCambiar={setVerDesarrollos} color="var(--cn-red-600)">
            Mostrar los {desarrollos.length} desarrollos inmobiliarios
          </Interruptor>
        </div>

        <Card tone="surface" padding="0" style={{ overflow: 'hidden' }}>
          <div style={{ background: 'var(--cn-cream-100)', padding: 'var(--space-4)' }}>
            <svg viewBox={'0 0 ' + M.w + ' ' + M.h} role="img"
              aria-label={'Mapa del distrito de Nosara con ' + visibles.length + ' topónimos. La lista completa en texto está debajo del mapa.'}
              style={{ width: '100%', height: 'auto', display: 'block', maxHeight: '78vh' }}>
              <path d={M.path} fill="var(--cn-white)" stroke="var(--cn-navy-300)" strokeWidth="2.5"
                strokeLinejoin="round" />
              {visibles.map(p => (
                <Punto key={p.n} p={p} activo={sel && sel.n === p.n} onTocar={setSel} />
              ))}
              {/* Localidades que quedan fuera del distrito, al este: se rotulan
                  con una flecha hacia afuera en vez de un punto interno. */}
              {fuera.map(p => (
                <text key={p.n} x={M.w - 10} y={p.y + 6} textAnchor="end"
                  fontSize="17" fontFamily="var(--font-display)" fontWeight="500" fontStyle="italic"
                  fill="var(--cn-ink-400)"
                  style={{ paintOrder: 'stroke', stroke: 'var(--cn-cream-100)', strokeWidth: 4 }}>
                  {p.n} →
                </text>
              ))}
            </svg>
          </div>

          <div style={{ padding: 'var(--space-5) var(--space-6)', borderTop: 'var(--border-width) solid var(--border-subtle)' }}>
            {sel ? (
              <div>
                <div style={{ display: 'flex', alignItems: 'center', gap: 'var(--space-3)', flexWrap: 'wrap' }}>
                  <h3 style={{ margin: 0, fontSize: 'var(--fs-xl)' }}>{sel.n}</h3>
                  <Badge tone={sel.c === 'o' ? 'navy' : sel.c === 'd' ? 'accent' : 'neutral'} size="sm">
                    {NOMBRE_CLASE[sel.c]}
                  </Badge>
                  <span style={{ fontFamily: 'var(--font-mono)', fontSize: 'var(--fs-3xs)', letterSpacing: '0.1em', textTransform: 'uppercase', color: 'var(--text-faint)' }}>
                    IGN: {sel.t}
                  </span>
                </div>
                <p style={{ margin: '10px 0 0', fontSize: 'var(--fs-sm)', color: 'var(--text-muted)', maxWidth: '70ch' }}>
                  {(window.CN_MAPA_RAZONES && window.CN_MAPA_RAZONES[sel.n]) || 'Clasificado según su categoría en la cartografía oficial.'}
                </p>
              </div>
            ) : (
              <p style={{ margin: 0, fontSize: 'var(--fs-sm)', color: 'var(--text-muted)' }}>
                Toque cualquier nombre del mapa para ver cómo fue clasificado y por qué.
              </p>
            )}
          </div>
        </Card>

        {/* Lista en texto: sirve al lector de pantalla, al buscador y a los
            modelos de lenguaje que indexan la página. Un mapa en SVG solo no
            se puede leer en voz alta. */}
        <details style={{ marginTop: 'var(--space-6)' }}>
          <summary style={{ cursor: 'pointer', fontFamily: 'var(--font-display)', fontWeight: 600, fontSize: 'var(--fs-sm)', color: 'var(--cn-navy-700)', padding: 'var(--space-3) 0' }}>
            Ver los {M.puntos.length} nombres en lista
          </summary>
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(240px,1fr))', gap: 'var(--space-6)', marginTop: 'var(--space-4)' }}>
            {[['Nombres originarios', originarias, 'o'], ['Desarrollos inmobiliarios', desarrollos, 'd']]
              .concat(dudosos.length ? [['Sin resolver', dudosos, 'r']] : [])
              .map(([titulo, lista, clase]) => (
              <div key={clase}>
                <h4 style={{ fontSize: 'var(--fs-sm)', margin: '0 0 var(--space-3)', color: COLOR[clase] }}>
                  {titulo} <span style={{ fontVariantNumeric: 'tabular-nums', color: 'var(--text-faint)' }}>({lista.length})</span>
                </h4>
                <ul style={{ margin: 0, padding: 0, listStyle: 'none', display: 'grid', gap: 4 }}>
                  {lista.map(p => (
                    <li key={p.n} style={{ fontSize: 'var(--fs-sm)', color: 'var(--text-body)' }}>
                      {p.n} <span style={{ fontSize: 'var(--fs-3xs)', fontFamily: 'var(--font-mono)', color: 'var(--text-faint)' }}>{p.t}</span>
                    </li>
                  ))}
                </ul>
              </div>
            ))}
          </div>
        </details>

        {dudosos.length > 0 && (
          <Callout tone="quiet" title="Nombres pendientes de resolver" style={{ marginTop: 'var(--space-6)' }}>
            Estos aparecen en la cartografía oficial con doble naturaleza, o con un nombre que no calza con su
            categoría. Escríbanos si conoce el origen: <a href="mailto:adcdesarrollocomunitario@gmail.com">adcdesarrollocomunitario@gmail.com</a>.
          </Callout>
        )}

        <SourceNote>
          Fuente de la geometría y de las categorías: Instituto Geográfico Nacional de Costa Rica, capa de Localidades
          del distrito de Nosara (código 50206), actualizada al 18 de junio de 2024. Reproyectada de CR-SIRGAS CRTM05 a
          WGS84. La clasificación entre nombre originario y desarrollo se deriva del campo DESCRIPC del propio IGN,
          con correcciones documentadas una por una.
        </SourceNote>
      </div>
    </section>
  );
};
