import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { ehTextoDoSistema, LIMITE_DAS_OBSERVACOES, normalizarObservacoes, observacoesDoPedido } from "./observacoes.ts";

/*
  Este texto sai na nota fiscal. Os três estados do banco (nunca mexeram,
  apagaram, escreveram) precisam dar três respostas diferentes: confundir
  "apagou" com "nunca mexeu" faz a observação do orçamento voltar para a nota
  de quem tirou ela de propósito.
*/

describe("observacoesDoPedido", () => {
  it("pedido que nunca teve observação herda a do orçamento", () => {
    assert.deepEqual(observacoesDoPedido({ notes: null }, { notes: " Entregar na portaria, falar com Ana.\n" }), {
      texto: "Entregar na portaria, falar com Ana.",
      doOrcamento: true,
    });
  });

  it("observação escrita no pedido vence a do orçamento", () => {
    assert.deepEqual(observacoesDoPedido({ notes: "Cliente retira sexta." }, { notes: "Entregar na portaria." }), {
      texto: "Cliente retira sexta.",
      doOrcamento: false,
    });
  });

  it("observação apagada no pedido não traz a do orçamento de volta", () => {
    assert.deepEqual(observacoesDoPedido({ notes: "" }, { notes: "Entregar na portaria." }), { texto: "", doOrcamento: false });
  });

  it("pedido sem orçamento (balcão, loja) fica só com a dele", () => {
    assert.deepEqual(observacoesDoPedido({ notes: null }, null), { texto: "", doOrcamento: false });
    assert.deepEqual(observacoesDoPedido({ notes: "Sem cebola" }), { texto: "Sem cebola", doOrcamento: false });
    assert.deepEqual(observacoesDoPedido(null, undefined), { texto: "", doOrcamento: false });
  });

  it("orçamento com observação só de espaço não conta como herdada", () => {
    assert.deepEqual(observacoesDoPedido({ notes: null }, { notes: "   \n " }), { texto: "", doOrcamento: false });
  });

  /* O balcão escreve "Venda originada no PDV." em todo orçamento sem
     observação. Herdar isso poria o texto em cada cupom fiscal do balcão. */
  it("texto que o próprio sistema escreve não é observação de ninguém", () => {
    const vazio = { texto: "", doOrcamento: false };
    assert.deepEqual(observacoesDoPedido({ notes: null }, { notes: "Venda originada no PDV." }), vazio);
    assert.deepEqual(observacoesDoPedido({ notes: null }, { notes: "Cadastro criado automaticamente via Google na área do cliente do catálogo." }), vazio);
    assert.deepEqual(observacoesDoPedido({ notes: "Venda no balcão" }, null), vazio);
    assert.deepEqual(observacoesDoPedido({ notes: "Pedido feito pela loja virtual" }, { notes: "Embalar para presente" }), {
      texto: "Embalar para presente",
      doOrcamento: true,
    });
  });

  it("o que o operador digitou no balcão é observação de verdade", () => {
    assert.deepEqual(observacoesDoPedido({ notes: null }, { notes: "Venda originada no PDV, cliente busca às 17h" }), {
      texto: "Venda originada no PDV, cliente busca às 17h",
      doOrcamento: true,
    });
    assert.equal(ehTextoDoSistema("Cliente retira no balcão"), false);
  });
});

describe("normalizarObservacoes", () => {
  it("iguala as quebras de linha e tira a sobra", () => {
    assert.equal(normalizarObservacoes("  Linha 1  \r\nLinha 2\r\n\r\n\r\n\r\nLinha 3  "), "Linha 1\nLinha 2\n\nLinha 3");
  });

  it("vazio continua vazio, e o que não é texto vira vazio", () => {
    assert.equal(normalizarObservacoes("   "), "");
    assert.equal(normalizarObservacoes(null), "");
    assert.equal(normalizarObservacoes(undefined), "");
  });

  it("corta no limite", () => {
    assert.equal(normalizarObservacoes("a".repeat(LIMITE_DAS_OBSERVACOES + 50)).length, LIMITE_DAS_OBSERVACOES);
  });
});
