import type { Router } from "express";
import { getEpisodioById, getProgramaById } from "../podcast-db";
import { getFaixaOgData } from "../musica-db";
import { ENV } from "./env";

/**
 * SHARE SERVICE (jul/2026, substitui a lógica de OG dinâmico que vivia
 * dentro de server/_core/static.ts).
 *
 * Streaming e Compartilhamento são responsabilidades diferentes:
 *  - Streaming (static.ts)  → entrega o app React/PWA pra pessoas.
 *  - Compartilhamento (aqui) → entrega HTML mínimo com metadados pra
 *    robôs (WhatsApp, Facebook, Telegram, Google) e manda gente de
 *    verdade pro app.
 *
 * Por isso estas rotas NUNCA carregam index.html, nunca tocam no bundle
 * do Vite, nunca dependem do Service Worker — é uma resposta HTML
 * gerada na hora, com uma única consulta ao banco.
 *
 * IMPORTANTE — por que o redirecionamento é via <script>, não HTTP 302:
 * WhatsApp/Facebook/Telegram seguem redirecionamentos HTTP normalmente,
 * mas NÃO executam JavaScript. Um 302 de verdade faria o próprio
 * crawler ser redirecionado pra SPA antes de ler as meta tags — voltando
 * exatamente pro bug que essa rota resolve. Por isso: HTTP 200 sempre,
 * com HTML + <script> de
 * redirecionamento (só roda em navegador humano) + <meta
 * http-equiv="refresh"> como reforço pra navegadores/webviews sem JS.
 *
 * HUB-INTEGRATION-POINT (futuro): se o HUB ONFIDE algum dia precisar de
 * um serviço de compartilhamento cross-platform, ele deve chamar estas
 * rotas por referência (ou espelhar o padrão), nunca duplicar os dados
 * do SpotOnFide — mesma regra do resto do ecossistema.
 */

function escapeHtml(text: string): string {
  return text
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;");
}

function absolutizarImagem(origin: string, capa: string | null | undefined): string {
  const fallback = `${origin}${ENV.basePath}/logo_hz.jpg`;
  if (!capa) return fallback;
  if (/^https?:\/\//i.test(capa)) return capa;
  return `${origin}${ENV.basePath}${capa}`;
}

function paginaShare(params: {
  titulo: string;
  descricao: string;
  imagem: string;
  ogType: string;
  url: string;
  destino: string;
}): string {
  const { titulo, descricao, imagem, ogType, url, destino } = params;
  const tituloSeguro = escapeHtml(titulo);
  const destinoSeguro = escapeHtml(destino);

  return `<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta name="robots" content="noindex" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${tituloSeguro} · SpotOnFide</title>
<meta property="og:site_name" content="SpotOnFide" />
<meta property="og:type" content="${ogType}" />
<meta property="og:title" content="${tituloSeguro}" />
<meta property="og:description" content="${escapeHtml(descricao)}" />
<meta property="og:image" content="${escapeHtml(imagem)}" />
<meta property="og:url" content="${escapeHtml(url)}" />
<meta name="twitter:card" content="summary_large_image" />
<meta http-equiv="refresh" content="0; url=${destinoSeguro}" />
</head>
<body>
<script>location.replace(${JSON.stringify(destino)});</script>
<noscript>
  <p>Abrindo <a href="${destinoSeguro}">${tituloSeguro}</a> no SpotOnFide…</p>
</noscript>
</body>
</html>`;
}

export function registerShareRoutes(router: Router) {
  router.get("/share/episodio/:id", async (req, res) => {
    const id = Number(req.params.id);
    const destino = `${ENV.basePath}/episodio/${id}`;

    if (!Number.isInteger(id)) return res.redirect(destino);

    try {
      const episodio = await getEpisodioById(id);
      if (!episodio) return res.redirect(destino);

      let capa = episodio.capa;
      if (!capa && episodio.programaId) {
        const programa = await getProgramaById(episodio.programaId);
        capa = programa?.capa ?? null;
      }

      const origin = `${req.protocol}://${req.get("host")}`;
      const html = paginaShare({
        titulo: episodio.titulo,
        descricao: episodio.descricao ? episodio.descricao.slice(0, 200) : "SpotOnFide Podcast",
        imagem: absolutizarImagem(origin, capa),
        ogType: "video.episode",
        url: `${origin}${req.originalUrl}`,
        destino,
      });

      res.set("Content-Type", "text/html; charset=utf-8");
      res.set("Cache-Control", "no-store");
      res.send(html);
    } catch (err) {
      console.error("[SHARE] Erro ao gerar página de episódio:", err);
      res.redirect(destino);
    }
  });

  router.get("/share/faixa/:id", async (req, res) => {
    const id = Number(req.params.id);
    const destino = `${ENV.basePath}/musica/faixa/${id}`;

    if (!Number.isInteger(id)) return res.redirect(destino);

    try {
      const dados = await getFaixaOgData(id);
      if (!dados) return res.redirect(destino);

      const origin = `${req.protocol}://${req.get("host")}`;
      const html = paginaShare({
        titulo: dados.titulo,
        descricao: dados.artistaNome ? `Por ${dados.artistaNome} · SpotOnFide Música` : "SpotOnFide Música",
        imagem: absolutizarImagem(origin, dados.capa),
        ogType: "music.song",
        url: `${origin}${req.originalUrl}`,
        destino,
      });

      res.set("Content-Type", "text/html; charset=utf-8");
      res.set("Cache-Control", "no-store");
      res.send(html);
    } catch (err) {
      console.error("[SHARE] Erro ao gerar página de faixa:", err);
      res.redirect(destino);
    }
  });
}
