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

import { FORMATO_DO_CODIGO, gerarCodigoDeEnvio, lerCodigoDeEnvio, nomeDoArquivoEnviado } from "./codigo-de-envio.ts";

/* ------------------------------------------------------------ envio de imagem */

test("o código do envio tem 12 letras, sem as que se confundem, e não se repete", () => {
  const vistos = new Set<string>();
  for (let i = 0; i < 2000; i++) {
    const codigo = gerarCodigoDeEnvio();
    assert.match(codigo, FORMATO_DO_CODIGO);
    assert.doesNotMatch(codigo, /[0O1lI]/);
    vistos.add(codigo);
  }
  assert.equal(vistos.size, 2000);
});

test("o código é lido com ou sem o prefixo envio:, e do link inteiro", () => {
  assert.equal(lerCodigoDeEnvio("envio:Ab3dE9xK2mQp"), "Ab3dE9xK2mQp");
  assert.equal(lerCodigoDeEnvio("  envio: Ab3dE9xK2mQp "), "Ab3dE9xK2mQp");
  assert.equal(lerCodigoDeEnvio("ENVIO:Ab3dE9xK2mQp"), "Ab3dE9xK2mQp");
  assert.equal(lerCodigoDeEnvio("Ab3dE9xK2mQp"), "Ab3dE9xK2mQp");
  assert.equal(lerCodigoDeEnvio("https://admin.ktalogu.com.br/enviar/Ab3dE9xK2mQp"), "Ab3dE9xK2mQp");
  assert.equal(lerCodigoDeEnvio("https://admin.ktalogu.com.br/enviar/Ab3dE9xK2mQp/"), "Ab3dE9xK2mQp");
});

test("código fora do formato não passa", () => {
  for (const ruim of ["", null, undefined, 42, "envio:", "envio:curto", "envio:Ab3dE9xK2mQpX", "envio:Ab3dE9xK2m-p", "envio:../../etc", "produto:Ab3dE9xK2mQp"]) {
    assert.equal(lerCodigoDeEnvio(ruim), null, String(ruim));
  }
});

test("o nome do arquivo enviado sai limpo e com a extensão do formato de verdade", () => {
  assert.equal(nomeDoArquivoEnviado("Logo Nova Ação.PNG", "png"), "Logo-Nova-Acao.png");
  assert.equal(nomeDoArquivoEnviado("foto.jpeg", "webp"), "foto.webp");
  assert.equal(nomeDoArquivoEnviado("../../segredo.svg", "png"), "segredo.png");
  assert.equal(nomeDoArquivoEnviado("", "jpg"), "imagem.jpg");
  assert.equal(nomeDoArquivoEnviado(null, "gif"), "imagem.gif");
  assert.ok(nomeDoArquivoEnviado("a".repeat(300), "png").length <= 64);
});
