// -----------------------------------------------------------------------------
// Forma-Ka — Agrégateur de formations (province de Québec)
// Auteur : Simon-Pierre Boucher — contact@spboucher.ai
// App.tsx : layout global (header + ticker en direct + footer encre) et routage
// -----------------------------------------------------------------------------
import { useEffect, useState } from "react";
import { NavLink, Route, Routes, useLocation } from "react-router-dom";
import { fetchFacets, fetchSources, fetchStats, registerSourceNames, sourceName } from "./api";
import CookieConsent from "./components/CookieConsent";
import Home from "./pages/Home";
import FormationPage from "./pages/Formation";
import PrivacyPage from "./pages/Privacy";
import SourcesPage from "./pages/Sources";
import StatsPage from "./pages/Stats";

function Ticker() {
  const [items, setItems] = useState<string[]>([]);

  useEffect(() => {
    Promise.all([fetchStats(), fetchFacets(), fetchSources()])
      .then(([stats, facets, src]) => {
        registerSourceNames(src.sources);
        const parts: string[] = [`${stats.total} formations actives`];
        if ((stats.gratuites ?? 0) > 0) parts.push(`${stats.gratuites} gratuites`);
        if ((stats.en_ligne ?? 0) > 0) parts.push(`${stats.en_ligne} en ligne`);
        for (const t of (stats.par_type ?? []).slice(0, 5))
          parts.push(`${t.t} · ${t.n}`);
        for (const s of facets.sources.slice(0, 8))
          parts.push(`${sourceName(s.source)} · ${s.n}`);
        parts.push("Mise à jour automatique");
        setItems(parts);
      })
      .catch(() => setItems(["Forma-Ka — toutes les formations du Québec"]));
  }, []);

  if (items.length === 0) return null;
  // contenu doublé pour une boucle de défilement continue
  return (
    <div className="ticker" aria-hidden="true">
      <div className="ticker-track">
        {[...items, ...items].map((t, i) => (
          <span key={i}>{t}</span>
        ))}
      </div>
    </div>
  );
}

const NAV_LINKS = [
  { to: "/", label: "Formations", icon: "🎓", end: true },
  { to: "/stats", label: "Stats", icon: "📊", end: false },
  { to: "/sources", label: "Sources", icon: "🗂", end: false },
  { to: "/confidentialite", label: "Confidentialité", icon: "🔒", end: false },
];

function Header() {
  const [open, setOpen] = useState(false);
  const location = useLocation();

  // fermer le menu à chaque navigation + verrouiller le défilement en dessous
  useEffect(() => { setOpen(false); }, [location]);
  useEffect(() => {
    document.body.style.overflow = open ? "hidden" : "";
    return () => { document.body.style.overflow = ""; };
  }, [open]);

  return (
    <>
      <header className="header">
        <div className="container header-inner">
          <NavLink to="/" className="brand" aria-label="Forma-Ka — accueil">
            Forma<span className="ka">Ka</span>
            <span className="brand-tag">Cours · séminaires · ateliers — tout le Québec</span>
          </NavLink>
          <nav className="nav" aria-label="Navigation principale">
            <NavLink to="/" end className={({ isActive }) => (isActive ? "active" : "")}>
              Formations
            </NavLink>
            <NavLink to="/stats" className={({ isActive }) => (isActive ? "active" : "")}>
              Stats
            </NavLink>
            <NavLink to="/sources" className={({ isActive }) => (isActive ? "active" : "")}>
              Sources
            </NavLink>
          </nav>
          <button
            className={`menu-btn ${open ? "open" : ""}`}
            aria-expanded={open}
            aria-label={open ? "Fermer le menu" : "Ouvrir le menu"}
            onClick={() => setOpen(!open)}
          >
            <span /><span /><span />
          </button>
        </div>

        {/* menu déroulant mobile */}
        <div className={`mobile-menu ${open ? "open" : ""}`} role="navigation" aria-label="Menu mobile">
          {NAV_LINKS.map((l, i) => (
            <NavLink
              key={l.to}
              to={l.to}
              end={l.end}
              style={{ transitionDelay: open ? `${60 + i * 45}ms` : "0ms" }}
              className={({ isActive }) => `mm-link ${isActive ? "active" : ""}`}
              onClick={() => setOpen(false)}
            >
              <span className="mm-ico" aria-hidden="true">{l.icon}</span>
              {l.label}
              <span className="mm-arrow" aria-hidden="true">→</span>
            </NavLink>
          ))}
          <div className="mm-foot">
            Agrégateur indépendant — mis à jour automatiquement, chaque fiche
            renvoie à la formation originale.
          </div>
        </div>
      </header>
      {open && <div className="mm-backdrop" onClick={() => setOpen(false)} aria-hidden="true" />}
      <Ticker />
    </>
  );
}

function Footer() {
  return (
    <footer className="footer">
      <div className="container">
        <div className="fbrand">
          Forma<span className="ka">Ka</span>
        </div>
        <div className="frow">
          <div>
            <b>Agrégateur indépendant</b> de formations dans la province de Québec —
            cours en ligne, cours universitaires et collégiaux, séminaires, ateliers,
            certifications. Les fiches proviennent des sites publics des établissements
            et sont rafraîchies automatiquement — chaque fiche renvoie vers la page
            originale de la formation.
          </div>
        </div>
        <div className="fmono">
          © {new Date().getFullYear()} Simon-Pierre Boucher — contact@spboucher.ai
          {" · "}
          <NavLink to="/confidentialite">Confidentialité</NavLink>
          {" · "}
          <button
            className="flink"
            onClick={() => window.dispatchEvent(new Event("formaka:openConsent"))}
          >
            Gérer mes témoins
          </button>
        </div>
      </div>
    </footer>
  );
}

export default function App() {
  return (
    <>
      <Header />
      <main>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/formation/:uid" element={<FormationPage />} />
          <Route path="/stats" element={<StatsPage />} />
          <Route path="/sources" element={<SourcesPage />} />
          <Route path="/confidentialite" element={<PrivacyPage />} />
          <Route
            path="*"
            element={
              <div className="notice container">
                <div className="big">🧭</div>
                <h2>Page introuvable</h2>
                <p>Le lien demandé n'existe pas.</p>
              </div>
            }
          />
        </Routes>
      </main>
      <Footer />
      <CookieConsent />
    </>
  );
}
