// Preview del link (Open Graph) por restaurante.
// Los crawlers de WhatsApp/Facebook/etc. no ejecutan JS, asi que leen el HTML
// estatico (que trae los datos genericos de Gustito Xpress). Aqui, SOLO para
// esos bots y SOLO en la ruta de una tienda (/:slug), inyectamos el nombre,
// descripcion e imagen del restaurante en las etiquetas OG. Los humanos reciben
// la pagina estatica tal cual (sin latencia extra); el SPA renderiza lo real.

const SUPABASE_URL = 'https://szzhhlevtrcambcoytiz.supabase.co';
// La apikey se lee de las variables del proyecto en Cloudflare Pages
// (Settings -> Environment variables -> SUPABASE_ANON_KEY). Es la clave
// anon, publica por diseño, pero en el repo no va nada con forma de token.
// Si faltara, el preview cae al generico de Gustito Xpress sin romper nada.

// Rutas que NO son una tienda (no reescribir).
const RUTAS_INTERNAS = new Set(['pedido', 'cuenta', 'ticket', 'verificar']);

const BOT_RE =
  /facebookexternalhit|WhatsApp|Twitterbot|TelegramBot|Slackbot|Discordbot|LinkedInBot|Googlebot|bingbot|Pinterest|redditbot|Applebot|SkypeUriPreview|vkShare|Embedly|preview/i;

interface RestOG {
  nombre: string;
  descripcion: string | null;
  logo_url: string | null;
  portada_url: string | null;
}

export const onRequest: PagesFunction<{ SUPABASE_ANON_KEY?: string }> = async ({ request, next, env }) => {
  const res = await next();
  const ANON = env?.SUPABASE_ANON_KEY || '';
  if (!ANON) return res; // sin llave configurada: preview generico, sin fallar

  const ua = request.headers.get('user-agent') || '';
  if (!BOT_RE.test(ua)) return res; // humanos: pagina estatica intacta

  const url = new URL(request.url);
  const seg = url.pathname.replace(/^\/+|\/+$/g, '');
  if (!seg || seg.includes('/') || seg.includes('.') || RUTAS_INTERNAS.has(seg)) return res;

  const ct = res.headers.get('content-type') || '';
  if (!ct.includes('text/html')) return res;

  let rest: RestOG | null = null;
  try {
    const r = await fetch(
      `${SUPABASE_URL}/rest/v1/restaurantes?slug=eq.${encodeURIComponent(seg)}&activo=eq.true&publicado=eq.true&select=nombre,descripcion,logo_url,portada_url&limit=1`,
      { headers: { apikey: ANON, authorization: `Bearer ${ANON}` } },
    );
    if (r.ok) {
      const arr = (await r.json()) as RestOG[];
      rest = Array.isArray(arr) ? arr[0] ?? null : null;
    }
  } catch {
    return res;
  }
  if (!rest) return res;

  const titulo = `${rest.nombre} · Gustito Xpress`;
  const desc = rest.descripcion || `Mira el menu de ${rest.nombre} y pide facil por Gustito Xpress.`;
  const img = rest.portada_url || rest.logo_url || 'https://pedir.gustitoxpress.app/icon-512.png';

  return new HTMLRewriter()
    .on('title', { element: (e) => e.setInnerContent(titulo) })
    .on('meta[property="og:title"]', { element: (e) => e.setAttribute('content', titulo) })
    .on('meta[name="twitter:title"]', { element: (e) => e.setAttribute('content', titulo) })
    .on('meta[property="og:description"]', { element: (e) => e.setAttribute('content', desc) })
    .on('meta[name="twitter:description"]', { element: (e) => e.setAttribute('content', desc) })
    .on('meta[name="description"]', { element: (e) => e.setAttribute('content', desc) })
    .on('meta[property="og:image"]', { element: (e) => e.setAttribute('content', img) })
    .on('meta[name="twitter:image"]', { element: (e) => e.setAttribute('content', img) })
    .on('meta[property="og:url"]', { element: (e) => e.setAttribute('content', url.toString()) })
    .transform(res);
};
