import type { Express } from "express";
import { eq, and } from "drizzle-orm";
import { db } from "./db.js";
import { bibliotecaAnotacoes, bibliotecaLivros } from "../../shared/schema.js";

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

export function registrarRotaCompartilhamento(app: Express) {
  app.get("/share/livro/:id", async (req, res) => {
    const id = Number(req.params.id);
    const ref = typeof req.query.ref === "string" ? req.query.ref : undefined;

    const [livro] = await db.select().from(bibliotecaLivros).where(eq(bibliotecaLivros.id, id));
    if (!livro || livro.status !== "publicado") {
      res.status(404).send("Livro não encontrado.");
      return;
    }

    // O id de quem compartilhou viaja até a ficha (?ref=) — é a base
    // pro programa de afiliados/divulgadores que o Marsan quer montar.
    // Esta rota só carrega o id adiante; atribuição/comissão fica pra
    // quando o HUB tiver o sistema de afiliados de verdade.
    const destino = `/livro/${livro.id}${ref ? `?ref=${encodeURIComponent(ref)}` : ""}`;
    const capa = livro.capaUrl || "/media/images/capas/capa-placeholder.svg";
    const descricao = (livro.resumo || `Um livro de ${livro.autor}, na Biblioteca OnFide.`).slice(0, 200);

    res.send(`<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<title>${escaparHtml(livro.titulo)}</title>
<meta property="og:title" content="${escaparHtml(livro.titulo)}">
<meta property="og:description" content="${escaparHtml(descricao)}">
<meta property="og:image" content="${escaparHtml(capa)}">
<meta http-equiv="refresh" content="0; url=${escaparHtml(destino)}">
<script>location.replace(${JSON.stringify(destino)});</script>
</head>
<body>Redirecionando…</body>
</html>`);
  });

  app.get("/share/trecho/:id", async (req, res) => {
    const id = Number(req.params.id);
    const ref = typeof req.query.ref === "string" ? req.query.ref : undefined;

    const [anotacao] = await db
      .select()
      .from(bibliotecaAnotacoes)
      .where(
        and(
          eq(bibliotecaAnotacoes.id, id),
          eq(bibliotecaAnotacoes.tipo, "compartilhamento"),
          eq(bibliotecaAnotacoes.publico, true),
        ),
      );

    if (!anotacao) {
      res.status(404).send("Trecho não encontrado.");
      return;
    }

    const [livro] = await db.select().from(bibliotecaLivros).where(eq(bibliotecaLivros.id, anotacao.livroId));
    if (!livro) {
      res.status(404).send("Livro não encontrado.");
      return;
    }

    const parametroRef = ref ? `&ref=${encodeURIComponent(ref)}` : "";
    const destino = `/leitor/${livro.id}?cfi=${encodeURIComponent(anotacao.cfiInicio)}${parametroRef}`;
    const capa = livro.capaUrl || "/media/images/capas/capa-placeholder.svg";
    const trecho = (anotacao.trechoTexto || "").slice(0, 200);

    // JS + meta refresh, nunca HTTP 302 — crawlers do WhatsApp/Telegram
    // seguem redirect HTTP mas não executam JS; um 302 real levaria o
    // próprio crawler pra SPA e perderia a prévia (capa/trecho).
    res.send(`<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<title>${escaparHtml(livro.titulo)}</title>
<meta property="og:title" content="${escaparHtml(livro.titulo)}">
<meta property="og:description" content="${escaparHtml(trecho)}">
<meta property="og:image" content="${escaparHtml(capa)}">
<meta http-equiv="refresh" content="0; url=${escaparHtml(destino)}">
<script>location.replace(${JSON.stringify(destino)});</script>
</head>
<body>Redirecionando…</body>
</html>`);
  });
}
