// -----------------------------------------------------------------------------
// Lou-Ka — Agrégateur de logements à louer (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 ListingPage from "./pages/Listing";
import BotPage from "./pages/Bot";
import PasserellePage from "./pages/Passerelle";
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} logements actifs`,
          `Québec ${stats.quebec ?? 0}`,
          `Lévis ${stats.levis ?? 0}`,
        ];
        if ((stats.montreal ?? 0) > 0) parts.push(`Grand Montréal ${stats.montreal}`);
        if (stats.avg_price != null)
          parts.push(`Loyer moyen ${Math.round(stats.avg_price)} $`);
        for (const s of facets.sources.slice(0, 10))
          parts.push(`${sourceName(s.source)} · ${s.n}`);
        parts.push("Mise à jour automatique");
        setItems(parts);
      })
      .catch(() => setItems(["Lou-Ka — logements à louer au 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: "Logements", icon: "🏠", end: true },
  { to: "/?view=carte", label: "Carte", icon: "◈", end: false, force: 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="Lou-Ka — accueil">
            Lou<span className="ka">Ka</span>
            <span className="brand-tag">Québec · Lévis · Montréal — toujours à jour</span>
          </NavLink>
          <nav className="nav" aria-label="Navigation principale">
            <NavLink to="/" end className={({ isActive }) => (isActive ? "active" : "")}>
              Logements
            </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 && !l.force ? "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 à l'annonce 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">
          Lou<span className="ka">Ka</span>
        </div>
        <div className="frow">
          <div>
            <b>Agrégateur indépendant</b> de logements à louer dans la province de Québec.
            Les annonces proviennent des sites publics des gestionnaires immobiliers et sont
            rafraîchies automatiquement — chaque fiche renvoie vers l'annonce originale.
          </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("louka:openConsent"))}
          >
            Gérer mes témoins
          </button>
        </div>
      </div>
    </footer>
  );
}

export default function App() {
  return (
    <>
      <Header />
      <main>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/logement/:uid" element={<ListingPage />} />
          <Route path="/stats" element={<StatsPage />} />
          <Route path="/sources" element={<SourcesPage />} />
          <Route path="/confidentialite" element={<PrivacyPage />} />
          <Route path="/passerelle/:uid" element={<PasserellePage />} />
          <Route path="/bot" element={<BotPage />} />
          <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 />
    </>
  );
}
