import { describe, expect, it } from "vitest";
import { formatDate, formatDateTime, formatKm, formatMoney } from "@/lib/format/format";
import { parseClientIp } from "@/lib/net/client-ip";
import { safeAdminRedirect } from "@/lib/security/safe-redirect";
import { slugify, vehicleSlug } from "@/lib/text/slug";
import { loginSchema, newPasswordSchema } from "@/lib/validation/auth";

describe("formatos", () => {
  it("moneda USD y PEN como en el brief", () => {
    expect(formatMoney("24900.00", "USD")).toBe("US$ 24,900");
    expect(formatMoney(89900, "PEN")).toBe("S/ 89,900");
    expect(formatMoney("89900.5", "PEN")).toBe("S/ 89,900.50");
  });

  it("kilometraje", () => {
    expect(formatKm(18450)).toBe("18,450 km");
  });

  it("fechas DD/MM/YYYY en hora de Lima", () => {
    // 2026-01-01 03:00 UTC = 31/12/2025 22:00 en Lima (UTC−5)
    expect(formatDate("2026-01-01T03:00:00Z")).toBe("31/12/2025");
    expect(formatDateTime("2026-01-01T03:00:00Z")).toBe("31/12/2025 22:00");
  });
});

describe("slug", () => {
  it("URL amigable sin tildes", () => {
    expect(
      vehicleSlug({ brand: "Toyota", model: "Corolla Cross", version: "XEI", year: 2025 }),
    ).toBe("toyota-corolla-cross-xei-2025");
    expect(slugify("  Citroën Berlingo — Edición Ñandú ")).toBe("citroen-berlingo-edicion-nandu");
  });
});

describe("IP del cliente", () => {
  it("usa la entrada agregada por el proxy de confianza (la más a la derecha)", () => {
    expect(parseClientIp("1.1.1.1, 203.0.113.7", 1)).toBe("203.0.113.7");
    expect(parseClientIp("spoofed, 198.51.100.2, 10.0.0.1", 2)).toBe("198.51.100.2");
  });

  it("valores ausentes o inválidos → unknown", () => {
    expect(parseClientIp(null, 1)).toBe("unknown");
    expect(parseClientIp("1.1.1.1", 0)).toBe("unknown");
    expect(parseClientIp("<script>", 1)).toBe("unknown");
  });
});

describe("redirección segura tras el login", () => {
  it("acepta rutas internas del panel", () => {
    expect(safeAdminRedirect("/admin/leads?estado=NEW")).toBe("/admin/leads?estado=NEW");
  });

  it("rechaza destinos externos o raros", () => {
    for (const bad of [
      "https://evil.com",
      "//evil.com",
      "/\\evil.com",
      "/admin\\..",
      "/vehiculos",
      "/admin/login",
      null,
    ]) {
      expect(safeAdminRedirect(bad)).toBe("/admin");
    }
  });
});

describe("validación de login y contraseñas", () => {
  it("normaliza el email", () => {
    const parsed = loginSchema.parse({ email: "  Admin@Chesco.LOCAL ", password: "x" });
    expect(parsed.email).toBe("admin@chesco.local");
  });

  it("rechaza email inválido", () => {
    expect(loginSchema.safeParse({ email: "no-es-email", password: "x" }).success).toBe(false);
  });

  it("política de contraseña: 10+ caracteres con letra y número", () => {
    expect(newPasswordSchema.safeParse("corta1").success).toBe(false);
    expect(newPasswordSchema.safeParse("sololetrasaqui").success).toBe(false);
    expect(newPasswordSchema.safeParse("1234567890123").success).toBe(false);
    expect(newPasswordSchema.safeParse("Chesco-2026-ok").success).toBe(true);
  });
});
