// Frangos — shared UI: contexts, icons, nav, footer, heat picker, reveal animations
const { useState, useEffect, useRef, useContext, createContext, useMemo } = React;

const AppCtx = createContext(null);
const useApp = () => useContext(AppCtx);

// ——— money ———
const dh = (n) => `${n} DH`;

// ——— Flame icon ———
function Flame({ size = 16, color = "currentColor", dim = false }) {
  return (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="none" style={{ opacity: dim ? 0.22 : 1, flexShrink: 0 }} aria-hidden="true">
      <path d="M12 2.5c.6 3.4-1.6 4.9-3 6.8-1.5 2-2.5 3.8-2.5 6A5.5 5.5 0 0 0 12 20.8a5.5 5.5 0 0 0 5.5-5.5c0-1.7-.6-3.2-1.4-4.6-.3-.5-1-.5-1.3 0-.3.6-.7 1.1-1.2 1.4.3-3.6-1.3-7.5-1.6-9.6z" fill={color}></path>
    </svg>
  );
}

// ——— Halal mark ———
function HalalBadge({ size = "md" }) {
  const { t } = useApp();
  const s = size === "lg" ? { pad: "10px 18px", font: 15, glyph: 22 } : { pad: "6px 12px", font: 12.5, glyph: 17 };
  return (
    <span className="halal-badge" style={{ padding: s.pad, fontSize: s.font }}>
      <svg width={s.glyph} height={s.glyph} viewBox="0 0 24 24" fill="none" aria-hidden="true">
        <circle cx="12" cy="12" r="10.5" stroke="currentColor" strokeWidth="1.6"></circle>
        <path d="M7.5 8v8M7.5 12h4M11.5 8v8M16.5 8c-1.8 2.2-1.8 5.8 0 8" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"></path>
      </svg>
      <span className="halal-badge-label">{t.hero.halal}</span>
    </span>
  );
}

// ——— heat colors ———
const HEAT_COLORS = ["#8FA84B", "#E8A33C", "#E8472B", "#9B1B0E"];

function HeatFlames({ level, size = 15 }) {
  return (
    <span style={{ display: "inline-flex", gap: 2, alignItems: "center" }} aria-label={`heat ${level + 1} of 4`}>
      {[0, 1, 2, 3].map((i) => (
        <Flame key={i} size={size} color={i <= level ? HEAT_COLORS[level] : "#5A4F45"} dim={i > level}></Flame>
      ))}
    </span>
  );
}

// ——— Heat picker (compact, for menu cards & cart) ———
function HeatPicker({ value, onChange, compact = false }) {
  const { t } = useApp();
  return (
    <div className={"heat-picker" + (compact ? " compact" : "")} role="radiogroup" aria-label={t.menu.pickHeat}>
      {t.heat.levels.map((lv, i) => (
        <button
          key={i}
          type="button"
          role="radio"
          aria-checked={value === i}
          className={"heat-chip" + (value === i ? " on" : "")}
          style={value === i ? { borderColor: HEAT_COLORS[i], color: "#fff", background: HEAT_COLORS[i] + "26" } : null}
          onClick={() => onChange(i)}
          title={lv.desc}
        >
          <Flame size={13} color={value === i ? HEAT_COLORS[i] : "#7A6E62"}></Flame>
          <span>{lv.name}</span>
        </button>
      ))}
    </div>
  );
}

// ——— Scroll reveal ———
function Reveal({ children, delay = 0, y = 28, as = "div", className = "", style = {} }) {
  const ref = useRef(null);
  const [on, setOn] = useState(false);
  const { motionOk } = useApp();
  useEffect(() => {
    if (!motionOk) { setOn(true); return; }
    const el = ref.current;
    if (!el) return;
    const io = new IntersectionObserver(
      ([e]) => { if (e.isIntersecting) { setOn(true); io.disconnect(); } },
      { threshold: 0.12 }
    );
    io.observe(el);
    return () => io.disconnect();
  }, [motionOk]);
  const Tag = as;
  return (
    <Tag
      ref={ref}
      className={className}
      style={{
        ...style,
        opacity: on ? 1 : 0,
        transform: on ? "none" : `translateY(${y}px)`,
        transition: `opacity .7s ease ${delay}ms, transform .7s cubic-bezier(.22,1,.36,1) ${delay}ms`,
      }}
    >
      {children}
    </Tag>
  );
}

// ——— Section heading ———
function SectionHead({ kicker, title, sub, center = false }) {
  return (
    <Reveal className={"section-head" + (center ? " center" : "")}>
      <div className="kicker"><Flame size={13} color="var(--accent)"></Flame><span>{kicker}</span></div>
      <h2 className="display">{title}</h2>
      {sub ? <p className="section-sub">{sub}</p> : null}
    </Reveal>
  );
}

// ——— Logo ———
function Logo({ size = 30, onClick }) {
  return (
    <a href="#/" className="logo" onClick={onClick} style={{ fontSize: size }}>
      <span className="logo-script">Frangos</span>
      <span className="logo-tag">fire grilled peri peri chicken</span>
    </a>
  );
}

// ——— Nav ———
function Nav() {
  const { t, lang, setLang, route, cartCount, motionOk } = useApp();
  const [scrolled, setScrolled] = useState(false);
  const [menuOpen, setMenuOpen] = useState(false);
  useEffect(() => {
    const fn = () => setScrolled(window.scrollY > 24);
    fn();
    window.addEventListener("scroll", fn, { passive: true });
    return () => window.removeEventListener("scroll", fn);
  }, []);
  useEffect(() => { setMenuOpen(false); }, [route]);

  const links = [
    ["/", t.nav.home],
    ["/menu", t.nav.menu],
    ["/reserve", t.nav.reserve],
    ["/story", t.nav.story],
  ];
  return (
    <header className={"nav" + (scrolled || menuOpen ? " solid" : "")}>
      <div className="nav-inner">
        <Logo size={26}></Logo>
        <nav className="nav-links" aria-label="Main">
          {links.map(([href, label]) => (
            <a key={href} href={"#" + href} className={"nav-link" + (route === href ? " on" : "")}>{label}</a>
          ))}
        </nav>
        <div className="nav-actions">
          <div className="lang-switch" role="group" aria-label={t.lang}>
            {["en", "fr", "ar"].map((l) => (
              <button key={l} className={"lang-btn" + (lang === l ? " on" : "")} onClick={() => setLang(l)}>
                {l === "ar" ? "ع" : l.toUpperCase()}
              </button>
            ))}
          </div>
          <a href="#/order" className="cart-btn" aria-label={t.cart}>
            <svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
              <path d="M6 7h12l-1.2 11.2a2 2 0 0 1-2 1.8H9.2a2 2 0 0 1-2-1.8L6 7z"></path>
              <path d="M9 9V6a3 3 0 0 1 6 0v3"></path>
            </svg>
            {cartCount > 0 ? <span className="cart-count">{cartCount}</span> : null}
          </a>
          <a href="#/order" className="btn btn-accent nav-order">{t.orderNow}</a>
          <button className={"burger" + (menuOpen ? " open" : "")} aria-label="Menu" onClick={() => setMenuOpen(!menuOpen)}>
            <span></span><span></span><span></span>
          </button>
        </div>
      </div>
      <div className={"nav-drawer" + (menuOpen ? " open" : "")}>
        {links.map(([href, label], i) => (
          <a key={href} href={"#" + href} className="drawer-link" style={{ transitionDelay: menuOpen && motionOk ? `${60 + i * 50}ms` : "0ms" }}>{label}</a>
        ))}
        <a href="#/order" className="btn btn-accent" style={{ alignSelf: "flex-start" }}>{t.orderNow}</a>
      </div>
    </header>
  );
}

// ——— Footer ———
function Footer() {
  const { t } = useApp();
  return (
    <footer className="footer">
      <div className="footer-inner">
        <div className="footer-brand">
          <Logo size={34}></Logo>
          <p className="footer-tag">{t.footer.tagline}</p>
          <HalalBadge></HalalBadge>
        </div>
        <div className="footer-col">
          <a href="#/menu" className="footer-link">{t.nav.menu}</a>
          <a href="#/order" className="footer-link">{t.nav.order}</a>
          <a href="#/reserve" className="footer-link">{t.nav.reserve}</a>
          <a href="#/story" className="footer-link">{t.nav.story}</a>
        </div>
        <div className="footer-col">
          <span className="footer-muted">{t.locations.address}</span>
          <span className="footer-muted">{t.locations.hours}</span>
          <span className="footer-muted" dir="ltr">{t.locations.phone}</span>
        </div>
      </div>
      <div className="footer-base">
        <span>{t.footer.rights}</span>
        <span className="footer-muted">{t.footer.madeFor}</span>
      </div>
    </footer>
  );
}

// ——— Toast ———
function Toast({ toast }) {
  return (
    <div className={"toast" + (toast ? " show" : "")} role="status" aria-live="polite">
      {toast ? (<React.Fragment><Flame size={15} color="var(--accent)"></Flame><span>{toast}</span></React.Fragment>) : null}
    </div>
  );
}

Object.assign(window, {
  AppCtx, useApp, dh, Flame, HalalBadge, HEAT_COLORS, HeatFlames, HeatPicker,
  Reveal, SectionHead, Logo, Nav, Footer, Toast,
});
