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

/* Contagem de uma ou várias células de uma vez (estoque_contar): o que a
   pessoa contou na prateleira vira o saldo, e a diferença vira movimento
   "contagem" na linha do tempo. Corpo: { linhas: [{celula_id, saldo}], observacao? } */
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 linhas = (Array.isArray(corpo?.linhas) ? (corpo!.linhas as Array<Record<string, unknown>>) : [])
    .map((l) => ({ celula_id: typeof l?.celula_id === "string" && UUID.test(l.celula_id) ? l.celula_id : null, saldo: numeroOuNulo(l?.saldo) }))
    .filter((l): l is { celula_id: string; saldo: number } => Boolean(l.celula_id) && l.saldo !== null);
  if (!linhas.length) return NextResponse.json({ error: "Nada para contar." }, { status: 400 });

  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_id));
  if (((minhas as unknown[] | null) ?? []).length !== new Set(linhas.map((l) => l.celula_id)).size) {
    return NextResponse.json({ error: "Célula não encontrada." }, { status: 404 });
  }

  const { data, error } = await r.e.supabase.rpc("estoque_contar", {
    p_linhas: linhas,
    p_observacao: textoOuNulo(corpo?.observacao, 400),
  });
  if (error) return respostaDoErro(error);
  return NextResponse.json(data);
}
