import { lerCorpo, rotaDeQuemEsta } from "@/lib/live/servidor/rota";
import { ErroDaLive, ladoDaConexao, publicarEstado } from "@/lib/live/servidor/sala";
import { configuracaoDoSfu, servidoresIce } from "@/lib/live/sfu";

export const runtime = "nodejs";

/*
 * Uma conexão de vídeo nova (a tela abriu ou reconectou): esquece a sessão
 * anterior no SFU (a nova nasce na primeira negociação) e, se era a de
 * mandar, o que a pessoa mandava por ela. Cada pessoa tem duas: a de mandar
 * ("envio") e a de receber ("recebe"). Devolve os servidores de rede (STUN/TURN).
 */
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" });
    if (sala.status === "encerrada" || sala.status === "cancelada") throw new ErroDaLive("A live terminou.", 410);
    const lado = ladoDaConexao((await lerCorpo(req)).lado);
    if (lado === "recebe") {
      await admin.from("live_participantes").update({ sfu_sessao_recebe: null }).eq("id", eu.id);
    } else {
      const tinhaTrilhas = Object.keys(eu.trilhas ?? {}).length > 0;
      await admin.from("live_participantes").update({ sfu_sessao: null, trilhas: {} }).eq("id", eu.id);
      if (tinhaTrilhas) await publicarEstado(admin, sala.id);
    }
    return { ok: true, ice: await servidoresIce() };
  });
}
