// Kotleto · MENU section — card grid with category tabs, search, animated add-to-cart

function MenuSection({ accent = "#D9461E" }) {
  const { lang } = useLang();
  const cart = useCart();
  const [cat, setCat] = useState("all");
  const [q, setQ] = useState("");
  const [flying, setFlying] = useState(null); // for add animation
  const [items, setItems] = useState(() => {
    const db = LocalDB.snapshot();
    return Array.isArray(db.adminMenu) ? db.adminMenu : MENU;
  });

  useEffect(() => {
    const sync = db => setItems(Array.isArray(db.adminMenu) ? db.adminMenu : MENU);
    const unsubscribe = LocalDB.subscribe(sync);
    sync(LocalDB.snapshot());
    return unsubscribe;
  }, []);

  const filtered = useMemo(() => {
    let m = items.filter(item => item.active !== false);
    if (cat !== "all") m = m.filter(x => x.cat === cat);
    if (q.trim()) {
      const Q = q.toLowerCase();
      m = m.filter(x => (x.fa.name + x.en.name + x.fa.desc + x.en.desc).toLowerCase().includes(Q));
    }
    return m;
  }, [items, cat, q]);

  const handleAdd = (item, e) => {
    cart.add({ id: item.id, name: item[lang]?.name || item.fa.name, price: item.price, emoji: item.emoji, color: item.color, photo: KotletoImages.resolve(item.photo, item.id) });
    notify(lang === "fa" ? item.fa.name + " به سبد اضافه شد" : item.en.name + " added to cart");
    // pop animation
    const rect = e.currentTarget.getBoundingClientRect();
    setFlying({ x: rect.left, y: rect.top, color: item.color, key: Date.now() });
    setTimeout(() => setFlying(null), 700);
  };

  return (
    <section id="menu" style={{ position: "relative", padding: "80px 0" }}>
      <Wrap className="wrap-pad">
        {/* Header row */}
        <div className="stack-mobile" style={{ display: "flex", justifyContent: "space-between", alignItems: "flex-end", flexWrap: "wrap", gap: 24, marginBottom: 40 }}>
          <SectionTitle
            eyebrow={{ fa: "منوی ما", en: "Our menu" }}
            title={{ fa: "هرچی دلت بخواد", en: "Whatever you crave" }}
            sub={{ fa: "از کتلت کلاسیک تا ترکیب‌های جدید. هر روز تازه، هر روز با عشق.", en: "From classic to brand-new combos. Fresh daily, made with love." }}
            accent={accent}
          />
          <div className="menu-search-mobile" style={{ position: "relative", flex: "0 0 320px" }}>
            <Ico.Search style={{ position: "absolute", insetInlineStart: 16, top: "50%", transform: "translateY(-50%)", color: "var(--ink-3)" }} />
            <input
              value={q} onChange={e => setQ(e.target.value)}
              aria-label={lang === "fa" ? "جستجو در منو" : "Search menu"}
              placeholder={lang === "fa" ? "دنبال چی می‌گردی؟" : "What are you craving?"}
              style={{
                width: "100%", padding: "14px 16px",
                paddingInlineStart: 44,
                border: "1.5px solid var(--ink)", borderRadius: 999,
                background: "var(--paper)", fontSize: 15, fontWeight: 600,
                outline: "none",
              }}
            />
          </div>
        </div>

        {/* Category tabs */}
        <div className="scroll-x" style={{ display: "flex", gap: 10, paddingBottom: 8, marginBottom: 30 }}>
          {[{ id: "all", fa: "همه", en: "All", icon: "✦" }, ...CATEGORIES].map(c => {
            const active = cat === c.id;
            return (
              <button key={c.id} onClick={() => setCat(c.id)} style={{
                padding: "12px 20px", borderRadius: 999, whiteSpace: "nowrap",
                background: active ? "var(--ink)" : "var(--paper)",
                color: active ? "var(--paper)" : "var(--ink-2)",
                border: "1.5px solid var(--ink)",
                fontWeight: 700, fontSize: 14,
                display: "inline-flex", alignItems: "center", gap: 8,
                transition: "all .2s ease",
                boxShadow: active ? "0 4px 0 0 #000" : "none",
              }}>
                <span style={{ color: active ? accent : "var(--ink-3)", fontSize: 14 }}>{c.icon}</span>
                {c[lang]}
              </button>
            );
          })}
        </div>

        {/* Grid */}
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(min(100%, 290px), 1fr))", gap: 22 }}>
          {filtered.map((item, idx) => (
            <MenuCard key={item.id} item={item} idx={idx} onAdd={handleAdd} accent={accent} />
          ))}
          {!filtered.length && <div role="status" style={{ gridColumn: "1 / -1", padding: "40px 20px", textAlign: "center", color: "var(--ink-3)" }}>
            <div className="display" style={{ fontSize: 22 }}>{lang === "fa" ? "چیزی پیدا نشد" : "Nothing found"}</div>
            <button className="btn btn-ghost btn-sm" onClick={() => { setQ(""); setCat("all"); }} style={{ marginTop: 12 }}>{lang === "fa" ? "پاک کردن فیلترها" : "Clear filters"}</button>
          </div>}
        </div>
      </Wrap>

      {flying && (
        <div style={{
          position: "fixed", left: flying.x, top: flying.y, zIndex: 60, pointerEvents: "none",
          width: 50, height: 50, borderRadius: 999, background: flying.color, color: "#fff",
          display: "grid", placeItems: "center", fontSize: 22,
          animation: "flyToCart .65s cubic-bezier(0.5,-0.2,0.7,0.1) forwards",
        }}>
          <Ico.Bag />
        </div>
      )}
      <style>{`
        @keyframes flyToCart {
          0% { transform: translate(0,0) scale(1); opacity: 1; }
          70% { opacity: 1; }
          100% { transform: translate(${lang === "fa" ? "-30vw" : "30vw"}, -40vh) scale(0.2); opacity: 0; }
        }
      `}</style>
    </section>
  );
}

// Identical local image paths are shared by menu, admin and cart.
const ITEM_PHOTOS = KotletoImages.menu;

function MenuCard({ item, idx, onAdd, accent }) {
  const { lang } = useLang();
  const [favorites, saveFavorites] = useStoredValue("favorites", []);
  const liked = favorites.includes(item.id);
  const data = item[lang] || item.fa;
  const photo = KotletoImages.resolve(item.photo, item.id);

  // alternating tilt
  const tilt = (idx % 3 === 0) ? -1.2 : (idx % 3 === 1) ? 0.8 : -0.4;

  const toggleLiked = () => {
    const next = !liked;
    saveFavorites(current => next ? [...new Set([...current, item.id])] : current.filter(id => id !== item.id));
    notify(next ? (lang === "fa" ? "به علاقه‌مندی‌ها اضافه شد" : "Added to favorites") : (lang === "fa" ? "از علاقه‌مندی‌ها حذف شد" : "Removed from favorites"));
  };

  return (
    <article style={{
      background: "var(--paper)",
      border: "1.5px solid var(--ink)",
      borderRadius: 24,
      overflow: "hidden",
      display: "flex", flexDirection: "column",
      boxShadow: "0 6px 0 0 var(--ink)",
      transform: `rotate(${tilt}deg)`,
      transition: "transform .25s ease, box-shadow .25s ease",
      position: "relative",
    }}
    onMouseEnter={e => { e.currentTarget.style.transform = `rotate(0deg) translateY(-4px)`; e.currentTarget.style.boxShadow = "0 12px 0 0 var(--ink)"; }}
    onMouseLeave={e => { e.currentTarget.style.transform = `rotate(${tilt}deg)`; e.currentTarget.style.boxShadow = "0 6px 0 0 var(--ink)"; }}
    >
      {/* image */}
      <div style={{
        position: "relative", height: 200,
        background: item.color,
        borderBottom: "1.5px solid var(--ink)",
        overflow: "hidden",
      }}>
        <img src={photo} alt={data.name}
          style={{ width: "100%", height: "100%", objectFit: "cover", mixBlendMode: "normal" }}
          loading="lazy"
          onError={(e)=>{ e.target.style.display="none"; }}
        />
        {/* badge & like */}
        <div style={{ position: "absolute", top: 12, insetInlineStart: 12, display: "flex", gap: 6 }}>
          {item.badge && <span style={{
            background: "var(--ink)", color: "var(--paper)",
            padding: "6px 10px", borderRadius: 999, fontSize: 11, fontWeight: 800, letterSpacing: 0.5,
          }}>{pick(item.badge, lang)}</span>}
          {item.spice > 0 && (
            <span style={{
              background: "#fff", color: accent,
              padding: "5px 9px", borderRadius: 999, display: "inline-flex", alignItems: "center", gap: 2,
              border: "1.5px solid var(--ink)",
            }}>
              {Array(item.spice).fill().map((_, i) => <Ico.Fire key={i} />)}
            </span>
          )}
        </div>
        <button onClick={toggleLiked} aria-pressed={liked} aria-label={lang === "fa" ? "علاقه‌مندی" : "Favorite"} style={{
          position: "absolute", top: 12, insetInlineEnd: 12,
          width: 36, height: 36, borderRadius: 999,
          background: liked ? accent : "#fff", color: liked ? "#fff" : "var(--ink-3)",
          border: "1.5px solid var(--ink)",
          display: "grid", placeItems: "center",
          transition: "all .2s ease",
        }}><Ico.Heart /></button>

        {/* emoji corner badge */}
        <div style={{
          position: "absolute", bottom: -16, insetInlineEnd: 16,
          width: 44, height: 44, borderRadius: 999, background: "var(--paper)",
          border: "1.5px solid var(--ink)", display: "grid", placeItems: "center", fontSize: 22,
        }}>{item.emoji}</div>
      </div>

      {/* body */}
      <div style={{ padding: "22px 20px 18px", display: "flex", flexDirection: "column", gap: 8, flex: 1 }}>
        <h3 className="display" style={{ margin: 0, fontSize: 22, lineHeight: 1.1, color: "var(--ink)" }}>{data.name}</h3>
        <p style={{ margin: 0, fontSize: 13, color: "var(--ink-3)", lineHeight: 1.55, flex: 1 }}>{data.desc}</p>
        <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: 10 }}>
          <span style={{ fontFamily: "var(--display)", fontSize: 22, color: "var(--ink)" }}>
            <Price value={item.price} />
          </span>
          <button onClick={(e) => onAdd(item, e)} className="btn btn-primary btn-sm">
            <Ico.Plus /> {lang === "fa" ? "اضافه" : "Add"}
          </button>
        </div>
      </div>
    </article>
  );
}

window.ITEM_PHOTOS = ITEM_PHOTOS;
window.MenuSection = MenuSection;
window.MenuCard = MenuCard;
