// data.jsx — content model for Cafetería La Z · carta real (Esquel)

// price can be a number (ARS) or null → "Consultar"
const fmt = (n) => (n == null ? null : '$' + n.toLocaleString('es-AR'));

const CATEGORIES = [
  { id: 'cafe',        label: 'Cafés',            en: 'Coffee',          icon: 'coffee' },
  { id: 'especiales',  label: 'Cafés especiales', en: 'Specialty',       icon: 'star' },
  { id: 'frios',       label: 'Cafés fríos',      en: 'Cold coffee',     icon: 'cupToGo' },
  { id: 'calientes',   label: 'Mates y bebidas',  en: 'Mate & hot',      icon: 'mate' },
  { id: 'pasteleria',  label: 'Para acompañar',   en: 'To accompany',    icon: 'cookie' },
  { id: 'sanguches',   label: 'Sándwiches',       en: 'Sandwiches',      icon: 'sandwich' },
  { id: 'frias',       label: 'Frías',            en: 'Cold drinks',     icon: 'bottle' },
  { id: 'adicionales', label: 'Adicionales',      en: 'Extras',          icon: 'plus' },
];

const P = (id) => `assets/img/productos/${id}.jpg?v=20260709`;

const BASE_PRODUCTS = [
  // ── Cafés ───────────────────────────────────────────
  { id: 'espresso',         cat: 'cafe', photo: P('espresso'),         name: 'Café espresso',                 en: 'Espresso',                vol: '60cc',  price: 2500, icon: 'coffee', tone: 'brand' },
  { id: 'espresso-largo',   cat: 'cafe', photo: P('espresso-largo'),   name: 'Café espresso largo',           en: 'Long espresso',           vol: '180cc', price: 3000, icon: 'coffee', tone: 'brand' },
  { id: 'americano',        cat: 'cafe', photo: P('americano'),        name: 'Café americano',                en: 'Americano',               vol: '240cc', price: 3500, icon: 'coffee', tone: 'brand', tag: 'Clásico' },
  { id: 'doble',            cat: 'cafe', photo: P('doble'),            name: 'Café doble espresso',           en: 'Double espresso',         vol: '360cc', price: 4000, icon: 'coffee', tone: 'brand' },
  { id: 'cortado',          cat: 'cafe', photo: P('cortado'),          name: 'Espresso cortado con leche',    en: 'Espresso with milk',      vol: '',      price: 2800, icon: 'coffee', tone: 'brand' },
  { id: 'largo-cortado',    cat: 'cafe', photo: P('largo-cortado'),    name: 'Largo cortado con leche',       en: 'Long espresso with milk', vol: '',      price: 3300, icon: 'coffee', tone: 'brand' },
  { id: 'americano-cortado',cat: 'cafe', photo: P('americano-cortado'),name: 'Americano cortado con leche',   en: 'Americano with milk',     vol: '',      price: 3800, icon: 'coffee', tone: 'brand' },
  { id: 'doble-cortado',    cat: 'cafe', photo: P('doble-cortado'),    name: 'Doble espresso cortado',        en: 'Double espresso w/ milk', vol: '',      price: 4500, icon: 'coffee', tone: 'brand' },
  { id: 'con-leche-240',    cat: 'cafe', photo: P('con-leche-240'),    name: 'Café con leche',                en: 'Coffee with milk',        vol: '240cc', price: 4000, icon: 'coffee', tone: 'brand', tag: 'Favorito' },
  { id: 'con-leche-360',    cat: 'cafe', photo: P('con-leche-240'),    name: 'Café con leche',                en: 'Coffee with milk',        vol: '360cc', price: 5000, icon: 'coffee', tone: 'brand' },

  // ── Cafés especiales ────────────────────────────────
  { id: 'capuccino-240',    cat: 'especiales', photo: P('capuccino-240'),    name: 'Capuccino',                en: 'Cappuccino',              vol: '240cc', price: 4500, icon: 'coffee', tone: 'accent', tag: 'Favorito' },
  { id: 'capuccino-360',    cat: 'especiales', photo: P('capuccino-240'),    name: 'Capuccino',                en: 'Cappuccino',              vol: '360cc', price: 5500, icon: 'coffee', tone: 'accent' },
  { id: 'latte-240',        cat: 'especiales', photo: P('latte-240'),        name: 'Latte',                    en: 'Latte',                   vol: '240cc', price: 4200, icon: 'coffee', tone: 'accent' },
  { id: 'latte-360',        cat: 'especiales', photo: P('latte-240'),        name: 'Latte',                    en: 'Latte',                   vol: '360cc', price: 5200, icon: 'coffee', tone: 'accent' },
  { id: 'latte-vainilla',   cat: 'especiales', photo: P('latte-vainilla'),   name: 'Latte vainilla',           en: 'Vanilla latte',           vol: '360cc', price: 5500, icon: 'coffee', tone: 'accent' },
  { id: 'latte-caramel',    cat: 'especiales', photo: P('latte-caramel'),    name: 'Latte caramel',            en: 'Caramel latte',           vol: '360cc', price: 5500, icon: 'coffee', tone: 'accent' },
  { id: 'latte-choco',      cat: 'especiales', photo: P('latte-360'),        name: 'Latte chocoavellana',      en: 'Hazelnut chocolate latte',vol: '360cc', price: 5800, icon: 'coffee', tone: 'accent', tag: 'Estrella' },
  { id: 'submarino',        cat: 'especiales', photo: P('submarino'),        name: 'Submarino',                en: 'Hot chocolate',           vol: '360cc', price: 5500, icon: 'coffee', tone: 'accent', desc: 'Leche caliente y barra de chocolate.' },

  // ── Cafés fríos ─────────────────────────────────────
  { id: 'latte-caramel-frio',  cat: 'frios', photo: P('latte-caramel-frio'),  name: 'Latte caramel frío',  en: 'Iced caramel latte',  vol: 'Frío', price: 6500, icon: 'cupToGo', tone: 'lake' },
  { id: 'latte-vainilla-frio', cat: 'frios', photo: P('latte-vainilla-frio'), name: 'Latte vainilla frío', en: 'Iced vanilla latte',  vol: 'Frío', price: 6500, icon: 'cupToGo', tone: 'lake' },
  { id: 'cafe-tonic',          cat: 'frios', photo: P('cafe-tonic'),          name: 'Café tónic',          en: 'Coffee tonic',        vol: 'Frío', price: 7000, icon: 'cupToGo', tone: 'lake', tag: 'Refrescante' },

  // ── Mates y otras bebidas calientes ─────────────────
  { id: 'te',            cat: 'calientes', photo: P('te'),            name: 'Té',                en: 'Tea',                    vol: '',      price: 2500, icon: 'mate', tone: 'forest' },
  { id: 'tes-sabor',     cat: 'calientes', photo: P('tes-sabor'),     name: 'Tés saborizados',   en: 'Flavored teas',          vol: '',      price: 3000, icon: 'mate', tone: 'forest' },
  { id: 'mate-cocido',   cat: 'calientes', photo: P('mate-cocido'),   name: 'Mate cocido',       en: 'Tea-bagged mate',        vol: '',      price: 2500, icon: 'mate', tone: 'forest' },
  { id: 'servicio-mate', cat: 'calientes', photo: P('servicio-mate'), name: 'Servicio de mate',  en: 'Mate service',           vol: '',      price: 3500, icon: 'mate', tone: 'forest', tag: 'Bien patagónico', desc: 'Mate, yerba y termo con agua caliente.' },
  { id: 'vaso-leche',    cat: 'calientes', photo: P('vaso-leche'),    name: 'Vaso de leche',     en: 'Glass of milk',          vol: '240cc', price: 3000, icon: 'bottle', tone: 'forest' },
  { id: 'chocolatada',   cat: 'calientes', photo: P('chocolatada'),   name: 'Chocolatada',       en: 'Chocolate milk',         vol: '240cc', price: 4000, icon: 'bottle', tone: 'forest' },
  { id: 'agua-caliente', cat: 'calientes', photo: P('agua-caliente'), name: 'Agua caliente',     en: 'Hot water',              vol: '',      price: 1000, icon: 'mate', tone: 'forest' },

  // ── Para acompañar (alfajores + sánguches de miga) ──
  { id: 'alfajor-rosa',  cat: 'pasteleria', photo: P('alfajor-rosa'),   name: 'Alfajor Rosa de los vientos', en: 'Rosa de los vientos alfajor', vol: 'Artesanal', price: 6500, icon: 'cookie', tone: 'gold', tag: 'Artesanal' },
  { id: 'alfajor-ankatu',cat: 'pasteleria', photo: P('alfajor-ankatu'), name: 'Alfajor Ankatu',              en: 'Ankatu alfajor',              vol: 'Artesanal', price: 4500, icon: 'cookie', tone: 'gold' },
  { id: 'medialunas-jq', cat: 'pasteleria', photo: P('medialunas-jq'), name: 'Medialunas de jamón y queso', en: 'Ham & cheese croissants',     vol: 'Miga',      price: 4200, icon: 'sandwich', tone: 'gold' },
  { id: 'chips-jq',      cat: 'pasteleria', photo: P('chips-jq'),      name: 'Chips de jamón y queso',      en: 'Ham & cheese chips',          vol: 'Miga',      price: 4500, icon: 'sandwich', tone: 'gold' },
  { id: 'miga-jq',       cat: 'pasteleria', photo: P('miga-jq'), name: 'Sanguchitos de miga', en: 'Crustless sandwiches', vol: 'Miga', price: null, icon: 'sandwich', tone: 'gold', tag: 'Más pedido' },

  // ── Sánguches y comidas ─────────────────────────────
  { id: 'mila-carne', cat: 'sanguches', photo: P('mila-carne'), name: 'Sánguche de milanesa de carne', en: 'Beef milanesa sandwich',    vol: '', price: 10500, icon: 'sandwich', tone: 'forest', tag: 'Para el viaje', desc: 'Lechuga, tomate, jamón, queso, huevo duro y mayonesa.' },
  { id: 'mila-pollo', cat: 'sanguches', photo: P('mila-pollo'), name: 'Sánguche de milanesa de pollo', en: 'Chicken milanesa sandwich', vol: '', price: 11000, icon: 'sandwich', tone: 'forest' },
  { id: 'tostado-jq', cat: 'sanguches', photo: P('tostado-jq'), name: 'Tostado de jamón y queso', en: 'Toasted ham & cheese', vol: '', price: null, icon: 'sandwich', tone: 'forest', tag: 'Más pedido' },

  // ── Frías (gaseosas + jugos) ────────────────────────
  { id: 'coca',   cat: 'frias', photo: P('coca'),   name: 'Coca-Cola',  en: 'Coca-Cola',     vol: '500ml', price: 3000, icon: 'bottle', tone: 'lake' },
  { id: 'sprite', cat: 'frias', photo: P('sprite'), name: 'Sprite',     en: 'Sprite',        vol: '500ml', price: null, icon: 'bottle', tone: 'lake' },
  { id: 'fanta',  cat: 'frias', photo: P('fanta'),  name: 'Fanta',      en: 'Fanta',         vol: '500ml', price: null, icon: 'bottle', tone: 'lake' },
  { id: 'ades',   cat: 'frias', photo: P('ades'),   name: 'Ades',       en: 'Ades soy juice',vol: '',      price: null, icon: 'bottle', tone: 'lake' },
  { id: 'cepita', cat: 'frias', photo: P('cepita'), name: 'Cepita',     en: 'Cepita juice',  vol: '',      price: null, icon: 'bottle', tone: 'lake' },

  // ── Adicionales ─────────────────────────────────────
  { id: 'ad-leche', cat: 'adicionales', photo: P('ad-leche'), name: 'Adicional leche',         en: 'Extra milk',   vol: '', price: 500,  icon: 'plus', tone: 'brand' },
  { id: 'ad-coco',  cat: 'adicionales', photo: P('ad-coco'),  name: 'Adicional leche de coco', en: 'Coconut milk', vol: '', price: 1500, icon: 'plus', tone: 'brand' },
];

// "Combos viajero" — sugerencias armadas con productos reales (se piden en mostrador)
const BASE_COMBOS = [
  { id: 'combo-trochita', name: 'Combo Trochita', for: 'Para subir a La Trochita', tone: 'accent', icon: 'train', tag: 'El más pedido',
    items: ['con-leche-360', 'medialunas-jq', 'alfajor-ankatu'] },
  { id: 'combo-alerces', name: 'Combo Alerces', for: 'Para un día de bosque', tone: 'forest', icon: 'leaf',
    items: ['americano', 'mila-carne', 'alfajor-rosa'] },
  { id: 'combo-lahoya', name: 'Combo La Hoya', for: 'Para la nieve', tone: 'lake', icon: 'snow',
    items: ['submarino', 'chips-jq', 'latte-choco'] },
  { id: 'combo-mochilero', name: 'Combo Mochilero', for: 'Para el camino largo', tone: 'gold', icon: 'bag',
    items: ['servicio-mate', 'mila-pollo', 'alfajor-ankatu'] },
];

const DIR = (dest) => `https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(dest)}`;
const EMB = (q) => `https://maps.google.com/maps?q=${encodeURIComponent(q)}&z=11&output=embed`;

const BASE_ACTIVITIES = [
  { id: 'laguna-zeta', name: 'Reserva Natural Laguna La Zeta', en: 'Laguna La Zeta Nature Reserve', icon: 'leaf', tone: 'lake',
    meta: 'A 5 min · Imperdible', blurb: 'La joya a pasos del centro: laguna, bosque nativo, senderos, mirador y actividades al aire libre. El paseo que le da nombre a la Z.',
    recs: ['latte-240', 'mila-pollo', 'alfajor-rosa'], comboId: null,
    photo: 'assets/img/local/laguna.jpg?v=1',
    maps: DIR('Reserva Natural Laguna La Zeta Esquel'), embed: EMB('Reserva Natural Laguna La Zeta Esquel') },
  { id: 'alerces', name: 'Parque Nacional Los Alerces', en: 'Los Alerces National Park', icon: 'leaf', tone: 'forest',
    meta: 'A 45 min · UNESCO', blurb: 'Bosques milenarios, lagos turquesa y senderos para todo el día.',
    recs: ['americano', 'mila-carne', 'alfajor-rosa'], comboId: 'combo-alerces',
    maps: DIR('Parque Nacional Los Alerces, Chubut'), embed: EMB('Parque Nacional Los Alerces, Chubut') },
  { id: 'trochita', name: 'La Trochita', en: 'The Old Patagonian Express', icon: 'train', tone: 'accent',
    meta: 'Salidas desde Esquel', blurb: 'El viejo expreso patagónico, un tren a vapor histórico.',
    recs: ['submarino', 'medialunas-jq', 'alfajor-ankatu'], comboId: 'combo-trochita',
    maps: DIR('Estación La Trochita Esquel'), embed: EMB('Estación La Trochita Esquel') },
  { id: 'lahoya', name: 'Cerro La Hoya', en: 'La Hoya Ski Center', icon: 'snow', tone: 'lake',
    meta: 'A 20 min · Temporada', blurb: 'Esquí, nieve y vistas de toda la cordillera cerca del pueblo.',
    recs: ['submarino', 'chips-jq', 'latte-choco'], comboId: 'combo-lahoya',
    maps: DIR('Centro de esquí La Hoya Esquel'), embed: EMB('Centro de esquí La Hoya Esquel') },
  { id: 'miradores', name: 'Miradores y senderos', en: 'Lookouts & trails', icon: 'trail', tone: 'brand',
    meta: 'Alrededores de Esquel', blurb: 'Vistas del valle y caminatas cortas para estirar las piernas.',
    recs: ['latte-240', 'mila-pollo', 'alfajor-ankatu'], comboId: null,
    maps: DIR('Cerro La Cruz Esquel'), embed: EMB('Cerro La Cruz Esquel') },
  { id: 'excursiones', name: 'Excursiones y trekking', en: 'Day trips & trekking', icon: 'mountain', tone: 'dusk',
    meta: 'Medio día / día completo', blurb: 'Salidas guiadas por la cordillera y la estepa patagónica.',
    recs: ['cafe-tonic', 'mila-pollo', 'te'], comboId: 'combo-mochilero',
    maps: DIR('Esquel, Chubut'), embed: EMB('Esquel, Chubut') },
  { id: 'pesca', name: 'Pesca con mosca', en: 'Fly fishing', icon: 'fish', tone: 'gold',
    meta: 'Ríos y lagos', blurb: 'Aguas patagónicas famosas entre pescadores de todo el mundo.',
    recs: ['servicio-mate', 'medialunas-jq', 'latte-caramel-frio'], comboId: 'combo-mochilero',
    maps: DIR('Río Futaleufú Esquel'), embed: EMB('Río Futaleufú Esquel') },
];

// ── Nosotros ────────────────────────────────────────
const BASE_NOSOTROS = {
  intro: {
    title: 'Cafetería La Z',
    body: {
      es: 'Nacimos en la Terminal de Esquel con una idea simple: que cada viajero arranque su recorrido patagónico con el mejor café. Somos un equipo familiar apasionado por el buen sabor, la pastelería casera y la atención de verdad. Desde el primer espresso de la mañana hasta el último mate de la tarde, estamos acá para hacerte la espera más rica.',
      en: 'We were born at the Esquel bus terminal with a simple idea: that every traveler should start their Patagonian journey with the best coffee. We are a family team passionate about great flavor, homemade pastries, and genuine hospitality. From the first espresso of the morning to the last mate of the afternoon, we are here to make your wait more delicious.',
    },
    since: {
      es: 'En el corazón de la Terminal de Esquel',
      en: 'At the heart of Esquel\'s bus terminal',
    },
  },
  stories: [
    { id: 's1', date: 'Junio 2025',
      title: { es: 'Nueva carta de invierno', en: 'New winter menu' },
      body: { es: 'Incorporamos el submarino de barrita artesanal y los nuevos mates de hierbas patagónicas. Vení a probarlos antes de tu próximo viaje.', en: 'We added the artisan chocolate submarino and new Patagonian herbal mates. Come try them before your next trip.' },
    },
    { id: 's2', date: 'Mayo 2025',
      title: { es: '¡Gracias por el cariño!', en: 'Thank you for your support!' },
      body: { es: 'Superamos las 500 reseñas en Google y no podemos estar más agradecidos. Cada visita nos motiva a seguir mejorando.', en: 'We passed 500 Google reviews and couldn\'t be more grateful. Every visit motivates us to keep improving.' },
    },
  ],
  // Fotos reales del local (Terminal de Esquel)
  photos: [
    { id: 'g1', url: 'assets/img/local/frente.jpg?v=1',    caption: { es: 'Nuestro local en la Terminal de Esquel', en: 'Our spot at the Esquel bus terminal' } },
    { id: 'g2', url: 'assets/img/local/salon.jpg?v=1',     caption: { es: 'Mesas para esperar tu colectivo', en: 'Tables to wait for your bus' } },
    { id: 'g3', url: 'assets/img/local/mostrador.jpg?v=1', caption: { es: 'Atención de verdad, siempre', en: 'Genuine service, always' } },
    { id: 'g4', url: 'assets/img/local/interior.jpg?v=1',  caption: { es: 'Pastelería, snacks y regionales', en: 'Pastries, snacks & local treats' } },
    { id: 'g5', url: 'assets/img/local/latte.jpg?v=1',     caption: { es: 'Café con alfajor artesanal', en: 'Coffee with an artisan alfajor' } },
  ],
  reviews: [
    { id: 'r1', name: 'Lucía M.', stars: 5, text: 'El mejor café de toda la terminal. El latte chocoavellana es increíble, lo recomiendo siempre.' },
    { id: 'r2', name: 'Rodrigo P.', stars: 5, text: 'Atención súper amable y rápida. Ideal para tomar algo antes del colectivo sin perder tiempo.' },
    { id: 'r3', name: 'Ana K.', stars: 5, text: 'Los alfajores artesanales son una joya. Los compro siempre que paso por Esquel.' },
  ],
};

const BASE_HOURS = [
  { d: 'Todos los días', h: '06:00 – 23:00' },
];

// Horario legible por máquina para "Abierto ahora / Cerrado". day: 0=Dom … 6=Sáb.
// Todos los días 06:00–23:00 corrido (confirmado por el cliente).
const SCHEDULE = {
  0: [{ o: 6 * 60, c: 23 * 60 }],       // Domingo
  1: [{ o: 6 * 60, c: 23 * 60 }],       // Lunes
  2: [{ o: 6 * 60, c: 23 * 60 }],
  3: [{ o: 6 * 60, c: 23 * 60 }],
  4: [{ o: 6 * 60, c: 23 * 60 }],
  5: [{ o: 6 * 60, c: 23 * 60 }],       // Viernes
  6: [{ o: 6 * 60, c: 23 * 60 }],       // Sábado
};
const _hm = (m) => `${String(Math.floor(m / 60)).padStart(2, '0')}:${String(m % 60).padStart(2, '0')}`;
function openStatus(now = new Date()) {
  const day = now.getDay();
  const min = now.getHours() * 60 + now.getMinutes();
  const today = SCHEDULE[day] || [];
  for (const s of today) if (min >= s.o && min < s.c) return { open: true, until: _hm(s.c) };
  for (const s of today) if (min < s.o) return { open: false, next: _hm(s.o), when: 'today' };
  for (let i = 1; i <= 7; i++) {
    const sl = SCHEDULE[(day + i) % 7];
    if (sl && sl.length) return { open: false, next: _hm(sl[0].o), when: i === 1 ? 'tomorrow' : 'later' };
  }
  return { open: false };
}

const BASE_PLACE = {
  name: 'Cafetería La Z',
  addr: 'Av. Alvear 1801',
  inside: 'Dentro de la Terminal de Ómnibus de Esquel',
  city: 'Esquel · Chubut · Patagonia',
  // keyless Google Maps embed + directions
  embed: 'https://www.google.com/maps?q=Terminal+de+Omnibus+Esquel+Alvear+1801&z=16&output=embed',
  dir: 'https://www.google.com/maps/dir/?api=1&destination=Terminal+de+Omnibus+de+Esquel+Alvear+1801',
  instagram: 'https://instagram.com/cafeterialaz',
  igHandle: '@cafeterialaz',
  // deep-link to Google reviews (leave/read)
  reviewsUrl: 'https://www.google.com/maps?q=cafetería+la+z+esquel#lrd=0x961dad47c0746c73:0x9a52287c646e2396,3',
  // paste the Elfsight widget id here to show live Google reviews (e.g. 'a1b2c3d4-...')
  reviewsWidget: '075e4629-8a34-4a0b-8b5e-70a68c82f708',
};

// Minimal i18n for chrome text. Product/activity names stay as-is.
const STR = {
  es: {
    open: 'Abierto ahora', closed: 'Cerrado', opensWord: 'abre', closesWord: 'cierra', tomorrow: 'mañana',
    closes: 'cierra 22:00', terminal: 'Terminal de Esquel · Alvear 1801',
    tagline: 'Tu parada en Esquel\nantes de seguir viaje.',
    heroSub: 'Café de especialidad, mates y pastelería casera. A pasos de tu plataforma, en el corazón de la Patagonia.',
    seeMenu: 'Ver la carta', combosCta: 'Combos viajero', whatToDo: '¿Qué hacer en Esquel?', where: 'Dónde estamos',
    featured: 'Lo más pedido', forTheRoad: 'Para el camino',
    quick: 'Accesos rápidos', menu: 'La carta', combosTitle: 'Combos viajero', combosSub: 'Ideas para llevar y seguir viaje. Se arman en el mostrador.',
    esquelTitle: '¿Qué hacer en Esquel?', esquelSub: 'Antes de salir, pasá a buscar lo tuyo.',
    placeTitle: 'Dónde estamos', hoursTitle: 'Horarios', howTitle: 'Cómo llegar', directions: 'Cómo llegar',
    recommend: 'Te recomendamos', back: 'Volver', approx: 'aprox.', askCounter: 'Pedilo en el mostrador',
    consult: 'Consultar', pickupNote: 'Pedís y retirás en el mostrador. Sin apuro antes de tu colectivo.',
    tabs: ['Inicio', 'Carta', 'Esquel', 'Lugar', 'Nosotros'],
    orderTitle: 'Tu pedido', orderNote: 'Acercate al mostrador con lo que elegiste y te lo preparamos al momento.',
    storiesTitle: 'Novedades', reviewsTitle: 'Lo que dicen', reviewsWrite: 'Dejá tu reseña',
    reviewName: 'Tu nombre', reviewText: 'Contanos tu experiencia...', reviewSend: 'Publicar', reviewThanks: '¡Gracias por tu reseña!',
    nosotrosEyebrow: 'Quiénes somos',
  },
  en: {
    open: 'Open now', closed: 'Closed', opensWord: 'opens', closesWord: 'closes', tomorrow: 'tomorrow',
    closes: 'closes 10 PM', terminal: 'Esquel Terminal · Alvear 1801',
    tagline: 'Your stop in Esquel\nbefore the road.',
    heroSub: 'Specialty coffee, mate and homemade pastries. Steps from your platform, in the heart of Patagonia.',
    seeMenu: 'See the menu', combosCta: 'Traveler combos', whatToDo: 'What to do in Esquel?', where: 'Find us',
    featured: 'Most ordered', forTheRoad: 'For the road',
    quick: 'Quick access', menu: 'Menu', combosTitle: 'Traveler combos', combosSub: 'Ideas to grab & go. Built at the counter.',
    esquelTitle: 'What to do in Esquel?', esquelSub: 'Before you head out, grab yours.',
    placeTitle: 'Find us', hoursTitle: 'Hours', howTitle: 'How to get here', directions: 'Directions',
    recommend: 'We recommend', back: 'Back', approx: 'approx.', askCounter: 'Order at the counter',
    consult: 'Ask us', pickupNote: 'Order and pick up at the counter. No rush before your bus.',
    tabs: ['Home', 'Menu', 'Esquel', 'Place', 'About'],
    orderTitle: 'Your order', orderNote: 'Come to the counter with what you chose and we\'ll prepare it right away.',
    storiesTitle: 'News', reviewsTitle: 'What people say', reviewsWrite: 'Leave a review',
    reviewName: 'Your name', reviewText: 'Tell us about your experience...', reviewSend: 'Submit', reviewThanks: 'Thanks for your review!',
    nosotrosEyebrow: 'About us',
  },
};

// ── Merge panel overrides (from localStorage) onto the base content ──
const _ov = (typeof loadOverrides === 'function') ? loadOverrides() : {};

const PROD_FIELDS = ['name', 'en', 'desc', 'vol', 'tag', 'photo'];
function applyProduct(base, ov) {
  if (!ov) return base;
  const m = { ...base };
  PROD_FIELDS.forEach(k => { if (k in ov) m[k] = ov[k]; });
  if ('price' in ov) m.price = ov.price;
  if (ov.hidden) m.hidden = true;
  return m;
}

const PRODUCTS = BASE_PRODUCTS
  .map(p => applyProduct(p, _ov.products && _ov.products[p.id]))
  .concat(_ov.custom || [])
  .filter(p => !p.hidden);

const COMBOS = BASE_COMBOS
  .map(c => {
    const ov = _ov.combos && _ov.combos[c.id];
    if (!ov) return c;
    return { ...c, ...['name', 'for', 'items'].reduce((a, k) => (k in ov ? (a[k] = ov[k], a) : a), {}), hidden: ov.hidden };
  })
  .concat(_ov.customCombos || [])
  .filter(c => !c.hidden);

const ACTIVITIES = BASE_ACTIVITIES
  .map(a => {
    const ov = _ov.activities && _ov.activities[a.id];
    if (!ov) return a;
    return { ...a, ...['name', 'en', 'meta', 'blurb', 'photo'].reduce((o, k) => (k in ov ? (o[k] = ov[k], o) : o), {}), hidden: ov.hidden };
  })
  .filter(a => !a.hidden);

const HOURS = (_ov.hours && _ov.hours.length) ? _ov.hours : BASE_HOURS;
const PLACE = { ...BASE_PLACE, ...(_ov.place || {}) };
const TEASER_PHOTO = _ov.teaserPhoto || 'assets/img/local/mapa-esquel.jpg?v=1';
const _nov = _ov.nosotros || {};
const NOSOTROS = {
  intro: {
    title: BASE_NOSOTROS.intro.title,
    body: { ...BASE_NOSOTROS.intro.body, ...(_nov.intro?.body || {}) },
    since: { ...BASE_NOSOTROS.intro.since, ...(_nov.intro?.since || {}) },
  },
  stories: (_nov.stories && _nov.stories.length) ? _nov.stories : BASE_NOSOTROS.stories,
  photos: (_nov.photos) || BASE_NOSOTROS.photos,
  reviews: BASE_NOSOTROS.reviews,
};

const productById = (id) => PRODUCTS.find(p => p.id === id) || COMBOS.find(c => c.id === id)
  || BASE_PRODUCTS.find(p => p.id === id) || BASE_COMBOS.find(c => c.id === id);
const comboTotal = (c) => c.items.reduce((s, id) => { const p = productById(id); return s + (p && p.price ? p.price : 0); }, 0);

Object.assign(window, {
  fmt, CATEGORIES, PRODUCTS, COMBOS, ACTIVITIES, HOURS, PLACE, TEASER_PHOTO, STR, productById, comboTotal,
  SCHEDULE, openStatus,
  BASE_PRODUCTS, BASE_COMBOS, BASE_ACTIVITIES, BASE_HOURS, BASE_PLACE, NOSOTROS, BASE_NOSOTROS,
});
