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

import {
  conferirEstoqueDaVenda,
  esgotadoNaLista,
  faltasDaDisponibilidade,
  faltasPorLinha,
  fraseDasFaltas,
  itensParaConferir,
  textoDoDisponivel,
} from "./estoque-da-venda.ts";

/*
  O estoque na hora de vender (PDV, orçamento, assistente): a conta é do
  banco; aqui a tradução. Linha avulsa nunca vai ao banco, e a falta volta
  para a linha CERTA da lista original.
*/

test("só vai ao banco linha com produto e quantidade, e o índice volta para a lista original", () => {
  const { itens, origem } = itensParaConferir([
    { product_id: null, quantity: 1, title: "Item livre" },
    { product_id: "11111111-1111-4111-8111-111111111111", quantity: "2,5", width_m: "1,20", height_m: "0,00", title: "Lona" },
    { product_id: "22222222-2222-4222-8222-222222222222", quantity: 0 },
    { product_id: "33333333-3333-4333-8333-333333333333", quantity: 3, selected_options: { options: [] } },
  ]);
  assert.deepEqual(origem, [1, 3]);
  assert.equal(itens[0].quantity, 2.5);
  assert.equal(itens[0].width_m, 1.2);
  assert.equal(itens[0].height_m, null);
  assert.deepEqual(itens[1].selected_options, { options: [] });

  const faltas = faltasPorLinha(
    { ok: false, problemas: [{ indice: 1, mensagem: 'Acabou o estoque de "Camiseta lisa (G / Preta)" para "Camisetas": tem 0, o pedido precisa de 3.' }] },
    origem
  );
  assert.deepEqual(Array.from(faltas.keys()), [3]);
  assert.equal(fraseDasFaltas(faltas), 'Acabou o estoque de "Camiseta lisa (G / Preta)" para "Camisetas": tem 0, o pedido precisa de 3.');
  assert.equal(fraseDasFaltas(faltasPorLinha({ ok: true, problemas: [] }, origem)), null);
});

test("disponível: só falta o que limita; quem vende sem saldo nunca aparece", () => {
  const d = {
    v2: true,
    limita: true,
    cabe: false,
    disponivel: 0,
    itens: [
      { rotulo: "Camiseta lisa (G / Preta)", saldo: 0, precisa: 3, permite_negativo: false },
      { rotulo: "Filme DTF", saldo: -2, precisa: 0.24, permite_negativo: true },
    ],
  };
  assert.deepEqual(faltasDaDisponibilidade(d), ["Falta Camiseta lisa (G / Preta): tem 0, precisa 3."]);
  assert.equal(textoDoDisponivel(d), "Esgotado");
  assert.equal(textoDoDisponivel({ limita: true, disponivel: 12 }), "Dá para vender agora: 12");
  assert.equal(textoDoDisponivel({ limita: false, controla: false }), null);
  assert.deepEqual(faltasDaDisponibilidade({ limita: false, cabe: true, itens: [{ rotulo: "X", saldo: -5, precisa: 9, permite_negativo: true }] }), []);
  assert.deepEqual(
    faltasDaDisponibilidade({ limita: true, cabe: false, motivo: "falta_escolher", itens: [{ nome: "Camiseta lisa", sem_celula: true, falta_escolher: "tamanho e cor" }] }),
    ['Escolha tamanho e cor para tirar "Camiseta lisa" do estoque.']
  );
  assert.equal(esgotadoNaLista({ limita: true, cabe: false, motivo: null }), true);
  assert.equal(esgotadoNaLista({ limita: true, cabe: false, motivo: "falta_escolher" }), false);
  assert.equal(esgotadoNaLista({ limita: false, cabe: true }), false);
});

test("conferir no servidor: cabe, não cabe, e banco com erro não trava", async () => {
  const linhas = [{ product_id: "11111111-1111-4111-8111-111111111111", quantity: 2, title: "Caneca" }];
  const cabe = { rpc: async () => ({ data: { ok: true, problemas: [] }, error: null }) };
  const naoCabe = {
    rpc: async () => ({ data: { ok: false, problemas: [{ indice: 0, 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" } }) };
  assert.equal((await conferirEstoqueDaVenda(cabe, "dono", linhas)).frase, null);
  assert.equal((await conferirEstoqueDaVenda(naoCabe, "dono", linhas)).frase, 'Acabou o estoque de "Caneca": tem 1, o pedido precisa de 2.');
  assert.equal((await conferirEstoqueDaVenda(quebrado, "dono", linhas)).frase, null);
  assert.equal((await conferirEstoqueDaVenda(naoCabe, "dono", [{ product_id: null, quantity: 1 }])).frase, null);
});
