import { nomeDeTrilhaValido, podePublicar } from "@/lib/live/regras";
import { lerCorpo, rotaDeQuemEsta } from "@/lib/live/servidor/rota";
import { ErroDaLive, publicarEstado } from "@/lib/live/servidor/sala";

export const runtime = "nodejs";

/*
 * Religar a câmera ou o microfone que estava só pausado. Desligar a câmera
 * não fecha a trilha no SFU (a tela troca a imagem por nada, sem negociar de
 * novo); só tira a trilha do palco, e quem assiste para de receber. Religar
 * põe a mesma trilha de volta no palco: quem assiste puxa de novo, e quem
 * manda não renegocia nada.
 *
 * A trilha é sempre da sessão desta pessoa no SFU (quem assiste puxa pela
 * sessão dela), então um nome inventado só estraga o vídeo de quem inventou.
 */
export async function POST(req: Request, { params }: { params: Promise<{ salaId: string }> }) {
  const { salaId } = await params;
  return rotaDeQuemEsta(req, salaId, async ({ admin, sala, eu }) => {
    if (sala.status === "encerrada" || sala.status === "cancelada") throw new ErroDaLive("A live terminou.", 410);
    const corpo = await lerCorpo(req);
    const tipo = corpo.tipo === "cam" || corpo.tipo === "mic" ? corpo.tipo : null;
    const mid = typeof corpo.mid === "string" && /^[0-9a-z_-]{1,12}$/i.test(corpo.mid) ? corpo.mid : null;
    const nome = nomeDeTrilhaValido(corpo.nome) && tipo && corpo.nome.startsWith(`${tipo}-`) ? corpo.nome : null;
    if (!tipo || !mid || !nome || !eu.sfu_sessao) throw new ErroDaLive("Não deu para religar. Tente de novo.", 400, { motivo: "publicar_de_novo" });
    if (!podePublicar(eu.papel, tipo, sala, eu.pode_falar)) {
      throw new ErroDaLive(tipo === "mic" ? "Levante a mão e espere a loja liberar o seu microfone." : "Você não pode mandar isso nesta live.", 403, {
        motivo: "sem_permissao",
        tipo,
      });
    }
    const trilhas = { ...(eu.trilhas ?? {}), [tipo]: { mid, nome } };
    await admin.from("live_participantes").update({ trilhas }).eq("id", eu.id);
    await publicarEstado(admin, sala.id);
    return { ok: true };
  });
}
