/* MedMath — modern clinical homepage. */
const { useState, useEffect, useMemo, useRef } = React;
const { TOOLS, CATEGORIES } = window.MEDMATH_DATA;

const THEME_KEY = 'medmath:theme';
function getInitialTheme() {
  try {
    const saved = localStorage.getItem(THEME_KEY);
    if (saved === 'light' || saved === 'dark') return saved;
  } catch (e) {}
  return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}

/* ──────────────────────────────────────────────────────
   Formula glyph — renders the calculator's formula
   as a typographic mark on each card. Replaces emoji.
   ────────────────────────────────────────────────────── */
function FormulaGlyph({ formula, abbr, size = "md" }) {
  if (!formula) return null;

  if (formula.type === "fraction") {
    return (
      <div className={`fglyph fglyph-${size}`}>
        <div className="fglyph-fraction">
          <span className="fglyph-num">{formula.num}</span>
          <span className="fglyph-bar" />
          <span className="fglyph-den">{formula.den}</span>
        </div>
        {formula.factor && <span className="fglyph-factor">{formula.factor}</span>}
      </div>
    );
  }

  if (formula.type === "params") {
    return (
      <div className={`fglyph fglyph-${size} fglyph-params`}>
        {formula.parts.map((p, i) => (
          <span key={i} className="fglyph-param">
            {p}
            {i < formula.parts.length - 1 && <span className="fglyph-sep">·</span>}
          </span>
        ))}
      </div>
    );
  }

  if (formula.type === "custom") {
    return (
      <div className={`fglyph fglyph-${size} fglyph-custom`}>
        <span>{formula.text}</span>
      </div>
    );
  }

  return null;
}

/* ──────────────────────────────────────────────────────
   Tool Card — the centerpiece. Three variants.
   ────────────────────────────────────────────────────── */
function ToolCard({ tool, style, index }) {
  const cat = CATEGORIES[tool.category];
  const number = String(index + 1).padStart(2, "0");

  return (
    <a className={`card card--${style}`} href={tool.url}>
      <div className="card__top">
        <span className="card__num">{number}</span>
        <span className="card__cat">
          <span className="card__cat-dot" style={{ '--cat-hue': cat.hue }} />
          {cat.label}
        </span>
      </div>

      <div className="card__glyph">
        <FormulaGlyph formula={tool.formula} abbr={tool.abbr} />
      </div>

      <div className="card__body">
        {tool.abbr && <div className="card__abbr">{tool.abbr}</div>}
        <h3 className="card__name">{tool.name}</h3>
        <p className="card__desc">{tool.short}</p>
      </div>

      <div className="card__foot">
        <span className="card__inputs">
          <span className="card__inputs-label">inputs</span>
          <span className="card__inputs-val">{tool.inputs}</span>
        </span>
        <span className="card__arrow" aria-hidden="true">
          <svg width="18" height="10" viewBox="0 0 18 10" fill="none">
            <path d="M1 5h15M12 1l4 4-4 4" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"/>
          </svg>
        </span>
      </div>
    </a>
  );
}

/* ──────────────────────────────────────────────────────
   Header
   ────────────────────────────────────────────────────── */
function ThemeToggle({ theme, onToggle }) {
  const isDark = theme === 'dark';
  return (
    <button
      className="theme-toggle"
      onClick={onToggle}
      aria-label={isDark ? 'Mudar para tema claro' : 'Mudar para tema escuro'}
      title={isDark ? 'Tema claro' : 'Tema escuro'}
    >
      <span className="theme-toggle__track">
        <span className="theme-toggle__thumb">
          {isDark ? (
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" aria-hidden="true">
              <path d="M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5Z" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"/>
            </svg>
          ) : (
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" aria-hidden="true">
              <circle cx="12" cy="12" r="4" stroke="currentColor" strokeWidth="1.6"/>
              <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"/>
            </svg>
          )}
        </span>
      </span>
    </button>
  );
}

function Header({ onSearchFocus, theme, onToggleTheme }) {
  return (
    <header className="site-header">
      <div className="site-header__inner">
        <a href="#" className="brand">
          <span className="brand__mark" aria-hidden="true">
            <svg viewBox="0 0 24 24" width="22" height="22" fill="none">
              <rect x="2" y="2" width="20" height="20" rx="4" stroke="currentColor" strokeWidth="1.5"/>
              <path d="M6 12 L10 8 L14 16 L18 12" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" fill="none"/>
              <circle cx="18" cy="12" r="1.2" fill="currentColor"/>
            </svg>
          </span>
          <span className="brand__name">MedMath</span>
          <span className="brand__sep" aria-hidden="true">/</span>
          <span className="brand__tag">cálculos clínicos</span>
        </a>

        <nav className="site-nav">
          <button className="kbar" onClick={onSearchFocus}>
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" aria-hidden="true">
              <circle cx="11" cy="11" r="7" stroke="currentColor" strokeWidth="1.6"/>
              <path d="m20 20-3.5-3.5" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"/>
            </svg>
            <span>Buscar cálculo</span>
            <kbd>⌘K</kbd>
          </button>
          <a className="site-nav__link" href="#sobre">Sobre</a>
          <a className="site-nav__link" href="https://github.com/nobackslash" target="_blank" rel="noopener">
            GitHub
            <svg width="11" height="11" viewBox="0 0 24 24" fill="none" aria-hidden="true">
              <path d="M7 17 17 7M9 7h8v8" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"/>
            </svg>
          </a>
          <ThemeToggle theme={theme} onToggle={onToggleTheme} />
        </nav>
      </div>
    </header>
  );
}

/* ──────────────────────────────────────────────────────
   Hero
   ────────────────────────────────────────────────────── */
function Hero({ query, setQuery, inputRef }) {
  return (
    <section className="hero">
      <div className="hero__meta">
        <span className="hero__eyebrow">Biblioteca aberta · v1.2</span>
        <span className="hero__stat"><b>{TOOLS.length}</b> calculadoras</span>
        <span className="hero__stat"><b>{Object.keys(CATEGORIES).length}</b> categorias</span>
      </div>

      <h1 className="hero__title">
        Cálculos clínicos<br/>
        <span className="hero__title-accent">para estudantes de farmácia.</span>
      </h1>

      <p className="hero__lede">
        Ferramentas validadas para hemograma, gasometria, função renal e parâmetros
        metabólicos — com referências e interpretação automática dos resultados.
      </p>

      <div className="hero__search">
        <svg className="hero__search-icon" width="18" height="18" viewBox="0 0 24 24" fill="none">
          <circle cx="11" cy="11" r="7" stroke="currentColor" strokeWidth="1.6"/>
          <path d="m20 20-3.5-3.5" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"/>
        </svg>
        <input
          ref={inputRef}
          type="search"
          className="hero__search-input"
          placeholder="Busque por nome, sigla ou parâmetro — ex: pH, ALT, ASC, clearance…"
          value={query}
          onChange={(e) => setQuery(e.target.value)}
        />
        {query && (
          <button className="hero__search-clear" onClick={() => setQuery("")} aria-label="Limpar">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M6 6l12 12M18 6L6 18" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"/></svg>
          </button>
        )}
      </div>
    </section>
  );
}

/* ──────────────────────────────────────────────────────
   Filter bar
   ────────────────────────────────────────────────────── */
function Filters({ active, setActive, counts }) {
  const cats = Object.entries(CATEGORIES);
  return (
    <div className="filters">
      <div className="filters__label">Categoria</div>
      <div className="filters__chips">
        <button
          className={`chip ${active === 'all' ? 'chip--active' : ''}`}
          onClick={() => setActive('all')}
        >
          Todos
          <span className="chip__count">{counts.all}</span>
        </button>
        {cats.map(([key, cat]) => (
          <button
            key={key}
            className={`chip ${active === key ? 'chip--active' : ''}`}
            onClick={() => setActive(key)}
            style={{ '--cat-hue': cat.hue }}
          >
            <span className="chip__dot" />
            {cat.label}
            <span className="chip__count">{counts[key] ?? 0}</span>
          </button>
        ))}
      </div>
    </div>
  );
}

/* ──────────────────────────────────────────────────────
   Results section grouped by category
   ────────────────────────────────────────────────────── */
function Results({ tools, cardStyle, activeCategory, query }) {
  if (tools.length === 0) {
    return (
      <div className="empty">
        <div className="empty__glyph">∅</div>
        <h3>Nada encontrado para "{query}"</h3>
        <p>Tente outro termo, uma sigla (ASC, VCM) ou um parâmetro (pH, ALT).</p>
      </div>
    );
  }

  // Group by category for "all" view; flat list otherwise
  if (activeCategory !== 'all') {
    return (
      <section className="results">
        <div className="grid">
          {tools.map((t, i) => (
            <ToolCard key={t.id} tool={t} style={cardStyle} index={i} />
          ))}
        </div>
      </section>
    );
  }

  const grouped = {};
  tools.forEach(t => {
    grouped[t.category] = grouped[t.category] || [];
    grouped[t.category].push(t);
  });

  let runningIdx = 0;
  return (
    <section className="results">
      {Object.keys(CATEGORIES).map(catKey => {
        const list = grouped[catKey];
        if (!list) return null;
        const cat = CATEGORIES[catKey];
        return (
          <div className="results__group" key={catKey}>
            <div className="results__header">
              <div className="results__title">
                <span className="results__dot" style={{ '--cat-hue': cat.hue }} />
                {cat.label}
              </div>
              <div className="results__rule" />
              <div className="results__count">
                {list.length} {list.length === 1 ? 'cálculo' : 'cálculos'}
              </div>
            </div>
            <div className="grid">
              {list.map((t) => {
                const idx = runningIdx++;
                return <ToolCard key={t.id} tool={t} style={cardStyle} index={idx} />;
              })}
            </div>
          </div>
        );
      })}
    </section>
  );
}

/* ──────────────────────────────────────────────────────
   Disclaimer + suggest banner
   ────────────────────────────────────────────────────── */
function Banner() {
  return (
    <section className="banner" id="sobre">
      <div className="banner__card">
        <div className="banner__col">
          <span className="banner__eyebrow">Sugestões</span>
          <h3>Não encontrou o cálculo que precisa?</h3>
          <p>Envie a fórmula ou indique a referência bibliográfica — novas ferramentas são avaliadas e publicadas semanalmente.</p>
        </div>
        <a
          className="btn"
          href="https://docs.google.com/forms/d/e/1FAIpQLSe5s_9hcEjyBtO4JVWyodr8YcJhZiRei2l65ayY-WEIqHSD4A/viewform?usp=publish-editor"
          target="_blank" rel="noopener"
        >
          Sugerir um cálculo
          <svg width="12" height="12" viewBox="0 0 24 24" fill="none">
            <path d="M5 12h14M13 5l7 7-7 7" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/>
          </svg>
        </a>
      </div>

      <div className="disclaimer">
        <span className="disclaimer__tag">Aviso</span>
        <p>
          Ferramenta de apoio educacional. Os resultados não substituem o julgamento
          clínico de profissionais habilitados nem dispensam a análise integral
          do laudo, do contexto clínico e das referências laboratoriais locais.
        </p>
      </div>
    </section>
  );
}

/* ──────────────────────────────────────────────────────
   Footer
   ────────────────────────────────────────────────────── */
function Footer() {
  return (
    <footer className="site-footer">
      <div className="site-footer__inner">
        <div>
          <div className="brand brand--footer">
            <span className="brand__name">MedMath</span>
          </div>
          <p className="site-footer__tagline">
            Biblioteca aberta de cálculos clínicos · {new Date().getFullYear()}
          </p>
        </div>
        <div className="site-footer__cols">
          <div>
            <div className="site-footer__heading">Recursos</div>
            <a href="#sobre">Sobre o projeto</a>
            <a href="https://github.com/nobackslash" target="_blank" rel="noopener">Código no GitHub</a>
            <a href="https://docs.google.com/forms/d/e/1FAIpQLSe5s_9hcEjyBtO4JVWyodr8YcJhZiRei2l65ayY-WEIqHSD4A/viewform" target="_blank" rel="noopener">Sugerir cálculo</a>
          </div>
          <div>
            <div className="site-footer__heading">Categorias</div>
            {Object.values(CATEGORIES).map(c => (
              <a key={c.label} href="#">{c.label}</a>
            ))}
          </div>
          <div>
            <div className="site-footer__heading">Criado por</div>
            <a href="https://github.com/nobackslash" target="_blank" rel="noopener">@nobackslash</a>
            <span className="site-footer__muted">Uso educacional</span>
          </div>
        </div>
      </div>
      <div className="site-footer__legal">
        <span>© {new Date().getFullYear()} MedMath</span>
        <span>—</span>
        <span>Resultados não substituem avaliação clínica profissional.</span>
      </div>
    </footer>
  );
}

/* ──────────────────────────────────────────────────────
   App root
   ────────────────────────────────────────────────────── */
function App() {
  const [theme, setTheme] = useState(getInitialTheme);
  const [query, setQuery] = useState("");
  const [active, setActive] = useState('all');
  const inputRef = useRef(null);

  // Cmd/Ctrl+K to focus search
  useEffect(() => {
    const onKey = (e) => {
      if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {
        e.preventDefault();
        inputRef.current?.focus();
      }
    };
    window.addEventListener('keydown', onKey);
    return () => window.removeEventListener('keydown', onKey);
  }, []);

  const filtered = useMemo(() => {
    const q = query.trim().toLowerCase();
    return TOOLS.filter(tool => {
      const matchCat = active === 'all' || tool.category === active;
      const matchQ = !q || [
        tool.name, tool.short, tool.desc, tool.abbr ?? '', ...(tool.tags ?? [])
      ].some(s => s.toLowerCase().includes(q));
      return matchCat && matchQ;
    });
  }, [query, active]);

  const counts = useMemo(() => {
    const c = { all: TOOLS.length };
    Object.keys(CATEGORIES).forEach(k => {
      c[k] = TOOLS.filter(t => t.category === k).length;
    });
    return c;
  }, []);

  // Apply theme on root + persist
  useEffect(() => {
    document.documentElement.dataset.theme = theme;
    try { localStorage.setItem(THEME_KEY, theme); } catch (e) {}
  }, [theme]);

  const toggleTheme = () => setTheme(prev => prev === 'dark' ? 'light' : 'dark');

  return (
    <div className="page">
      <div className="page__grid" aria-hidden="true" />
      <Header
        onSearchFocus={() => inputRef.current?.focus()}
        theme={theme}
        onToggleTheme={toggleTheme}
      />
      <main className="main">
        <Hero query={query} setQuery={setQuery} inputRef={inputRef} />
        <Filters active={active} setActive={setActive} counts={counts} />
        <Results tools={filtered} cardStyle="formula" activeCategory={active} query={query} />
        <Banner />
      </main>
      <Footer />
    </div>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
