import assert from "node:assert/strict";
import { createHmac } from "node:crypto";
import { describe, it } from "node:test";

import { avisoDoMercadoPagoValido, pagamentoQueManda, voltaAutomaticaPermitida } from "./mercado-pago-ktalogu.ts";

describe("voltaAutomaticaPermitida", () => {
  it("só com endereço público em https", () => {
    assert.equal(voltaAutomaticaPermitida("https://admin.ktalogu.com.br/dashboard/assinatura?aba=notas&compra=1"), true);
  });

  it("recusa o que o Mercado Pago recusa: localhost, rede interna, http", () => {
    assert.equal(voltaAutomaticaPermitida("http://localhost:3002/dashboard/assinatura"), false);
    assert.equal(voltaAutomaticaPermitida("https://localhost/dashboard/assinatura"), false);
    assert.equal(voltaAutomaticaPermitida("https://192.168.0.10:3002/dashboard"), false);
    assert.equal(voltaAutomaticaPermitida("https://admin.local/dashboard"), false);
    assert.equal(voltaAutomaticaPermitida("http://admin.ktalogu.com.br/dashboard"), false);
    assert.equal(voltaAutomaticaPermitida("isso não é url"), false);
  });
});

describe("pagamentoQueManda", () => {
  it("aprovado ganha do recusado mais novo", () => {
    const manda = pagamentoQueManda([
      { id: 2, status: "rejected", date_created: "2026-09-18T12:00:00Z" },
      { id: 1, status: "approved", date_created: "2026-09-18T11:00:00Z" },
    ]);
    assert.equal(manda?.id, 1);
  });

  it("entre iguais, o mais recente", () => {
    const manda = pagamentoQueManda([
      { id: 1, status: "pending", date_created: "2026-09-18T11:00:00Z" },
      { id: 2, status: "pending", date_created: "2026-09-18T12:00:00Z" },
    ]);
    assert.equal(manda?.id, 2);
    assert.equal(pagamentoQueManda([]), null);
  });
});

describe("avisoDoMercadoPagoValido", () => {
  const segredo = "chave-de-teste";
  const ts = "1758196800";
  const manifesto = `id:12345;request-id:req-1;ts:${ts};`;
  const v1 = createHmac("sha256", segredo).update(manifesto).digest("hex");

  it("aceita a assinatura certa dentro da tolerância", () => {
    assert.equal(
      avisoDoMercadoPagoValido({ segredo, assinatura: `ts=${ts},v1=${v1}`, idDaRequisicao: "req-1", idDoDado: "12345", agoraEmSegundos: Number(ts) + 30 }),
      true
    );
  });

  it("recusa assinatura alterada, dado trocado ou aviso velho", () => {
    assert.equal(
      avisoDoMercadoPagoValido({ segredo, assinatura: `ts=${ts},v1=${v1.replace(/^./, "0")}`, idDaRequisicao: "req-1", idDoDado: "12345", agoraEmSegundos: Number(ts) }),
      false
    );
    assert.equal(
      avisoDoMercadoPagoValido({ segredo, assinatura: `ts=${ts},v1=${v1}`, idDaRequisicao: "req-1", idDoDado: "99999", agoraEmSegundos: Number(ts) }),
      false
    );
    assert.equal(
      avisoDoMercadoPagoValido({ segredo, assinatura: `ts=${ts},v1=${v1}`, idDaRequisicao: "req-1", idDoDado: "12345", agoraEmSegundos: Number(ts) + 2 * 60 * 60 }),
      false
    );
    assert.equal(avisoDoMercadoPagoValido({ segredo, assinatura: null, idDaRequisicao: null, idDoDado: null }), false);
  });
});
