import { NextResponse } from "next/server";
import { abrirEstoque, UUID } from "@/lib/estoque/servidor";
import { lerItens } from "@/lib/estoque/leituras.server";
import { quantoDaParaFazer } from "@/lib/estoque/regras";
import type { Disponibilidade, EstoqueDoProdutoNaLista, ModoDoProduto } from "@/lib/estoque/tipos";

/*
 * O estoque de cada produto da lista, pela conta do estoque novo:
 *  - pronto: a soma das células do item pronto (e quantas estão zeradas);
 *  - sob encomenda: quanto dá para fazer com os insumos de hoje
 *    (estoque_disponivel; sem combinação escolhida, produto com grade fica
 *    "depende da variação");
 *  - não controla: nada.
 * Corpo: { ids: string[] } (até 300). Fora do v2: { v2: false }.
 */

export async function POST(req: Request) {
  const r = await abrirEstoque(["products.read", "products.stock.read"]);
  if (!r.ok) return r.resposta;
  if (!r.e.v2) return NextResponse.json({ v2: false });
  const corpo = (await req.json().catch(() => null)) as { ids?: unknown } | null;
  const ids = (Array.isArray(corpo?.ids) ? corpo!.ids : []).filter((x): x is string => typeof x === "string" && UUID.test(x)).slice(0, 300);
  if (!ids.length) return NextResponse.json({ v2: true, produtos: {} });

  const { data } = await r.e.admin.from("products").select("id,estoque_modo,estoque_item_id").in("id", ids).in("user_id", r.e.ids);
  const produtos = (data as Array<{ id: string; estoque_modo: string | null; estoque_item_id: string | null }> | null) ?? [];
  const prontos = await lerItens(r.e, { ids: produtos.map((p) => p.estoque_item_id).filter((x): x is string => Boolean(x)) });

  const saida: Record<string, EstoqueDoProdutoNaLista> = {};
  const fila = [...produtos];
  const trabalhar = async () => {
    for (let p = fila.shift(); p; p = fila.shift()) {
      const { data: disp } = await r.e.supabase.rpc("estoque_disponivel", {
        p_produto: p.id,
        p_selected_options: null,
        p_quantidade: 1,
        p_largura: null,
        p_altura: null,
        p_maximo: true,
      });
      const d = disp as Disponibilidade | null;
      const modo = (d?.modo ?? p.estoque_modo ?? "nenhum") as ModoDoProduto;
      const item = p.estoque_item_id ? prontos.find((i) => i.id === p.estoque_item_id) : undefined;
      saida[p.id] = {
        modo,
        saldo: modo === "pronto" && item ? item.celulas.reduce((s, c) => s + c.saldo, 0) : null,
        daPara: d ? quantoDaParaFazer(d) : null,
        limita: Boolean(d?.limita),
        dependeDaVariacao: d?.motivo === "falta_escolher",
        zeradas: modo === "pronto" && item ? item.celulas.filter((c) => c.saldo <= 0).length : 0,
        unidade: item?.unidade ?? null,
      };
    }
  };
  await Promise.all(Array.from({ length: 6 }, trabalhar));
  return NextResponse.json({ v2: true, produtos: saida });
}
