import { pedirAoPainel } from "@/lib/live/servidor/interno";
import { rotaDeQuemEsta } from "@/lib/live/servidor/rota";
import { cortarTrilhas, pessoasOnline, publicarEstado } from "@/lib/live/servidor/sala";
import { configuracaoDoSfu, fecharTrilhas } from "@/lib/live/sfu";

export const runtime = "nodejs";

/*
 * Saiu da sala (clicou em Sair, fechou a aba ou recarregou). Vem com
 * "keepalive", sem esperar resposta. Fecha no SFU o que a pessoa mandava,
 * para ninguém tentar receber de quem já foi.
 */
export async function POST(req: Request, { params }: { params: Promise<{ salaId: string }> }) {
  const { salaId } = await params;
  return rotaDeQuemEsta(req, salaId, async ({ admin, sala, eu }) => {
    const cfg = configuracaoDoSfu();
    if (cfg) {
      await cortarTrilhas(eu, ["cam", "mic", "tela", "tela-audio"], (sessao, mids) =>
        fecharTrilhas(cfg, sessao, { tracks: mids.map((mid) => ({ mid })), force: true }),
      ).catch(() => null);
    }
    await admin
      .from("live_participantes")
      .update({ saiu_em: new Date().toISOString(), mao_em: null, trilhas: {}, pode_falar: false })
      .eq("id", eu.id);
    /*
     * Quem grava é o navegador de quem organiza. Saiu e não ficou outra
     * pessoa organizando: o arquivo aberto não tem mais como fechar, então
     * desfaz no depósito (a sala não fica "gravando" para sempre). Se voltar
     * (recarregou), a gravação recomeça num arquivo novo.
     */
    if (eu.papel === "apresentador" && sala.gravacao_status === "gravando") {
      const outros = (await pessoasOnline(admin, sala.id)).filter((p) => p.id !== eu.id && p.papel === "apresentador");
      if (!outros.length) await pedirAoPainel("/api/live/gravacao", { sala: sala.id, acao: "cancelar" }, {}).catch(() => null);
    }
    await publicarEstado(admin, sala.id);
    return { ok: true };
  });
}
