import { NextResponse } from "next/server";
import { abrirEstoque, exigirV2, textoOuNulo, numeroOuNulo, UUID } from "@/lib/estoque/servidor";

/*
 * Entrada, perda ou ajuste numa ou em várias células (estoque_lancar).
 * Corpo: { tipo, observacao?, unidade?, custo?, linhas: [{celula_id, quantidade}] }
 *
 * Várias células = várias chamadas, uma por célula, na ordem. Se uma falha
 * (quantidade inválida, unidade sem conversão), as anteriores ficam e a
 * resposta diz quantas entraram — a tela mostra exatamente isso.
 */
export async function POST(req: Request) {
  const r = await abrirEstoque("products.stock.write");
  if (!r.ok) return r.resposta;
  const falta = exigirV2(r.e);
  if (falta) return falta;
  const corpo = (await req.json().catch(() => null)) as Record<string, unknown> | null;
  const tipo = corpo?.tipo;
  if (tipo !== "entrada" && tipo !== "perda" && tipo !== "ajuste") {
    return NextResponse.json({ error: "Escolha entrada, perda ou ajuste." }, { status: 400 });
  }
  const linhas = (Array.isArray(corpo?.linhas) ? (corpo!.linhas as Array<Record<string, unknown>>) : [])
    .map((l) => ({ celula: typeof l?.celula_id === "string" && UUID.test(l.celula_id) ? l.celula_id : null, quantidade: numeroOuNulo(l?.quantidade) }))
    .filter((l): l is { celula: string; quantidade: number } => Boolean(l.celula) && l.quantidade !== null && l.quantidade !== 0);
  if (!linhas.length) return NextResponse.json({ error: "Informe a quantidade de pelo menos uma célula." }, { status: 400 });
  if (linhas.length > 200) return NextResponse.json({ error: "Lance no máximo 200 células de uma vez." }, { status: 400 });

  /* Toda célula tem de ser desta empresa (o banco também confere). */
  const { data: minhas } = await r.e.admin
    .from("estoque_celulas")
    .select("id")
    .eq("empresa_id", r.e.dono)
    .in("id", linhas.map((l) => l.celula));
  const deMim = new Set(((minhas as Array<{ id: string }> | null) ?? []).map((c) => c.id));
  if (linhas.some((l) => !deMim.has(l.celula))) return NextResponse.json({ error: "Célula não encontrada." }, { status: 404 });

  const custo = numeroOuNulo(corpo?.custo);
  const observacao = textoOuNulo(corpo?.observacao, 400);
  const unidade = textoOuNulo(corpo?.unidade, 20);
  const feitos: unknown[] = [];
  for (const l of linhas) {
    const { data, error } = await r.e.supabase.rpc("estoque_lancar", {
      p_celula: l.celula,
      p_tipo: tipo,
      p_quantidade: l.quantidade,
      p_custo_unitario: tipo === "entrada" && custo !== null && custo >= 0 ? custo : null,
      p_observacao: observacao,
      p_unidade: unidade,
    });
    if (error) {
      return NextResponse.json(
        { error: error.message, hint: error.hint ?? null, feitos: feitos.length, total: linhas.length },
        { status: feitos.length ? 207 : 400 }
      );
    }
    feitos.push(data);
  }
  return NextResponse.json({ ok: true, feitos: feitos.length, resultados: feitos });
}

