import type { TipoDeTrilha } from "@/lib/live/evento";
import { TIPOS_DE_TRILHA } from "@/lib/live/evento";
import { lerCorpo, rotaDeQuemEsta } from "@/lib/live/servidor/rota";
import { ErroDaLive, ladoDaConexao, publicarEstado } from "@/lib/live/servidor/sala";
import { configuracaoDoSfu, fecharTrilhas } from "@/lib/live/sfu";

export const runtime = "nodejs";

/*
 * Parar de mandar (desligou a câmera, parou de mostrar a tela) ou de receber
 * (a pessoa saiu do palco). Com a oferta da tela, fecha negociando; sem ela,
 * fecha direto.
 */
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) throw new ErroDaLive("A transmissão ainda está sendo ligada pela Ktalogu.", 503, { motivo: "sem_sfu" });
    const corpo = await lerCorpo(req);
    const mids = (Array.isArray(corpo.mids) ? corpo.mids : [])
      .filter((m): m is string => typeof m === "string" && /^[0-9a-z_-]{1,12}$/i.test(m))
      .slice(0, 30);
    const sdp = typeof corpo.sdp === "string" && corpo.sdp.length < 200000 ? corpo.sdp : "";
    const tipos = (Array.isArray(corpo.tipos) ? corpo.tipos : []).filter((t): t is TipoDeTrilha =>
      TIPOS_DE_TRILHA.includes(t as TipoDeTrilha),
    );

    const sessao = ladoDaConexao(corpo.lado) === "recebe" ? eu.sfu_sessao_recebe : eu.sfu_sessao;
    let resposta = null;
    if (mids.length && sessao) {
      const r = await fecharTrilhas(cfg, sessao, {
        tracks: mids.map((mid) => ({ mid })),
        ...(sdp ? { sessionDescription: { type: "offer" as const, sdp } } : {}),
        force: !sdp,
      });
      resposta = r.sessionDescription ?? null;
    }
    if (tipos.length) {
      const trilhas = { ...(eu.trilhas ?? {}) };
      for (const t of tipos) delete trilhas[t];
      await admin.from("live_participantes").update({ trilhas }).eq("id", eu.id);
      await publicarEstado(admin, sala.id);
    }
    return { resposta };
  });
}
