import test from "node:test";
import assert from "node:assert/strict";

import { conferirEstoqueAntesDeCobrar, itensParaConferir, mensagemDosProblemas } from "./estoque-antes-de-cobrar.ts";

test("so manda ao banco item com produto e quantidade", () => {
  const itens = itensParaConferir([
    { product_id: "p1", quantity: 2, selected_options: { options: [] }, width_m: 1.2, height_m: 0.5, title: "Banner" },
    { product_id: "", quantity: 1 },
    { product_id: "p2", quantity: 0 },
    { product_id: null, quantity: 3 },
  ]);
  assert.equal(itens.length, 1);
  assert.deepEqual(itens[0], {
    product_id: "p1",
    quantity: 2,
    selected_options: { options: [] },
    width_m: 1.2,
    height_m: 0.5,
    title: "Banner",
  });
});

test("frase do problema: as duas primeiras e o resto contado", () => {
  assert.equal(mensagemDosProblemas([]), null);
  assert.equal(
    mensagemDosProblemas([{ mensagem: "Acabou A." }, { mensagem: "Acabou B." }, { mensagem: "Acabou C." }]),
    "Acabou A. Acabou B. E mais 1 item(ns). Ajuste o carrinho e tente de novo."
  );
});

test("cabe: segue; nao cabe: devolve a razao; banco com erro: nao trava", async () => {
  const cabe = { rpc: async () => ({ data: { ok: true, problemas: [] }, error: null }) };
  const naoCabe = {
    rpc: async () => ({ data: { ok: false, problemas: [{ mensagem: 'Acabou o estoque de "Caneca": tem 1, o pedido precisa de 2.' }] }, error: null }),
  };
  const quebrado = { rpc: async () => ({ data: null, error: { message: "fora do ar" } }) };
  const itens = [{ product_id: "p1", quantity: 2 }];
  assert.equal(await conferirEstoqueAntesDeCobrar(cabe, "dono", itens), null);
  assert.equal(
    await conferirEstoqueAntesDeCobrar(naoCabe, "dono", itens),
    'Acabou o estoque de "Caneca": tem 1, o pedido precisa de 2. Ajuste o carrinho e tente de novo.'
  );
  const erroOriginal = console.error;
  console.error = () => undefined;
  assert.equal(await conferirEstoqueAntesDeCobrar(quebrado, "dono", itens), null);
  console.error = erroOriginal;
  assert.equal(await conferirEstoqueAntesDeCobrar(naoCabe, "dono", []), null);
});

test("estoque v2: a frase ao cliente diz o produto e a combinação, não o insumo", async () => {
  const naoCabeV2 = {
    rpc: async () => ({
      data: {
        ok: false,
        problemas: [{ indice: 0, celula_id: "c1", disponivel: 0, mensagem: 'Acabou o estoque de "Camiseta lisa (G / Preta)" para "Camisetas": tem 0, o pedido precisa de 2.' }],
      },
      error: null,
    }),
  };
  const itens = [
    { product_id: "p1", quantity: 2, title: "Camisetas", selected_options: { options: [{ attribute_name: "Tamanho", label: "G" }, { attribute_name: "Cor", label: "Preta" }] } },
  ];
  assert.equal(await conferirEstoqueAntesDeCobrar(naoCabeV2, "dono", itens), "Camisetas (G / Preta): esgotado. Ajuste o carrinho e tente de novo.");
});
