/* global React, ALERTS, ALERT_CATS, useReveal */
const { useState, useMemo } = React;

function Alerts() {
  const [cat, setCat] = useState('Todas');
  const [query, setQuery] = useState('');
  const [ref, visible] = useReveal();

  const filtered = useMemo(() => {
    return ALERTS.filter(a => {
      const okCat = cat === 'Todas' || a.cat === cat;
      const okQ = !query || a.name.toLowerCase().includes(query.toLowerCase());
      return okCat && okQ;
    });
  }, [cat, query]);

  const counts = useMemo(() => {
    const c = { Todas: ALERTS.length };
    ALERTS.forEach(a => { c[a.cat] = (c[a.cat] || 0) + 1; });
    return c;
  }, []);

  return (
    <section className="section" id="alertas">
      <div className="container">
        <div className="alerts-head">
          <div>
            <span className="eyebrow">Catálogo de alertas</span>
            <h2 className="display alerts-title">
              {ALERTS.length} alertas configurables.<br/>
              <em>Tú decides cuáles activar.</em>
            </h2>
          </div>
          <div className="alerts-search">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round">
              <circle cx="11" cy="11" r="6"/><path d="M16 16l5 5"/>
            </svg>
            <input
              type="text"
              placeholder="Buscar una alerta..."
              value={query}
              onChange={e => setQuery(e.target.value)}
            />
          </div>
        </div>

        <div className="alerts-tabs" role="tablist">
          {ALERT_CATS.map(c => (
            <button
              key={c}
              role="tab"
              aria-selected={cat === c}
              className={'alerts-tab' + (cat === c ? ' is-active' : '')}
              onClick={() => setCat(c)}>
              {c}
              <span className="alerts-tab-count mono">{counts[c] || 0}</span>
            </button>
          ))}
        </div>

        <div ref={ref} className={'alerts-grid reveal' + (visible ? ' is-visible' : '')}>
          {filtered.map((a, i) => (
            <div key={`${a.cat}-${a.name}`} className="alert-chip" style={{ '--d': `${i * 14}ms` }}>
              <span className="alert-chip-cat mono">{a.cat}</span>
              <span className="alert-chip-name">{a.name}</span>
            </div>
          ))}
          {filtered.length === 0 && (
            <div className="alerts-empty">No encontramos alertas con "{query}".</div>
          )}
        </div>
      </div>

      <style>{`
        .alerts-head {
          display: grid;
          grid-template-columns: 1.5fr 1fr;
          gap: 32px;
          align-items: end;
          margin-bottom: 28px;
        }
        @media (max-width: 900px) {
          .alerts-head { grid-template-columns: 1fr; }
        }
        .alerts-title {
          font-size: clamp(36px, 4.6vw, 64px);
          margin: 14px 0 0;
          font-weight: 500;
          line-height: 1;
        }
        .alerts-title em { font-style: italic; color: var(--petrol); font-weight: 400; }
        .alerts-search {
          display: flex;
          gap: 10px;
          align-items: center;
          padding: 12px 16px;
          background: var(--bg-3);
          border: 1px solid var(--line-strong);
          border-radius: 999px;
          color: var(--ink-mute);
        }
        .alerts-search:focus-within { border-color: var(--petrol); }
        .alerts-search input {
          flex: 1;
          background: transparent;
          border: 0;
          outline: 0;
          font: inherit;
          color: var(--ink);
          font-size: 14px;
        }

        .alerts-tabs {
          display: flex;
          flex-wrap: wrap;
          gap: 8px;
          margin-bottom: 24px;
          padding-bottom: 16px;
          border-bottom: 1px solid var(--line);
        }
        .alerts-tab {
          display: inline-flex;
          gap: 8px;
          align-items: center;
          padding: 8px 14px;
          background: transparent;
          border: 1px solid var(--line-strong);
          border-radius: 999px;
          font-family: var(--font-display);
          font-size: 13px;
          color: var(--ink-2);
          transition: all .2s ease;
        }
        .alerts-tab:hover { border-color: var(--ink); color: var(--ink); }
        .alerts-tab.is-active {
          background: var(--ink);
          color: var(--bg);
          border-color: var(--ink);
        }
        [data-theme='dark'] .alerts-tab.is-active { color: #07171a; }
        .alerts-tab-count {
          font-size: 9px;
          opacity: 0.7;
        }
        .alerts-tab.is-active .alerts-tab-count { opacity: 0.9; }

        .alerts-grid {
          display: grid;
          grid-template-columns: repeat(3, 1fr);
          gap: 8px;
        }
        @media (max-width: 900px) { .alerts-grid { grid-template-columns: repeat(2, 1fr); } }
        @media (max-width: 600px) { .alerts-grid { grid-template-columns: 1fr; } }
        .alert-chip {
          background: var(--bg-3);
          border: 1px solid var(--line);
          border-radius: var(--radius-md);
          padding: 14px 16px;
          display: flex;
          flex-direction: column;
          gap: 4px;
          transition: transform .25s ease, border-color .25s ease, background .25s ease;
        }
        .alert-chip:hover {
          transform: translateY(-2px);
          border-color: var(--petrol);
          background: color-mix(in oklab, var(--petrol) 6%, var(--bg-3));
        }
        .alert-chip-cat {
          font-size: 9px;
          color: var(--peach-deep);
        }
        .alert-chip-name {
          font-family: var(--font-display);
          font-size: 14px;
          font-weight: 500;
          letter-spacing: -0.01em;
        }
        .alerts-empty {
          grid-column: 1 / -1;
          padding: 40px;
          text-align: center;
          color: var(--ink-mute);
          font-family: var(--font-mono);
          font-size: 13px;
        }
      `}</style>
    </section>
  );
}

window.Alerts = Alerts;
