import { describe, it, expect } from "vitest";
import { buildContactsExportCsv, ExportableContact } from "./build-contacts-export-csv";

function makeContact(overrides: Partial<ExportableContact> = {}): ExportableContact {
  return {
    name: "Maria Silva",
    email: "maria@example.com",
    phone: "11999999999",
    tags: ["vip"],
    status: "ACTIVE",
    source: "MANUAL",
    createdAt: new Date("2026-01-01T10:00:00.000Z"),
    listMemberships: [{ list: { name: "Newsletter" } }],
    ...overrides,
  };
}

describe("buildContactsExportCsv", () => {
  it("includes a UTF-8 BOM and semicolon-delimited headers for all columns when none are selected", () => {
    const csv = buildContactsExportCsv([makeContact()], []);

    expect(csv.charCodeAt(0)).toBe(0xfeff);
    expect(csv).toContain("Nome;E-mail;Telefone;Tags;Status;Origem;Data de Criação;Listas");
    expect(csv).toContain("Maria Silva");
    expect(csv).toContain("vip");
    expect(csv).toContain("Newsletter");
  });

  it("only includes the selected columns, in the requested order", () => {
    const csv = buildContactsExportCsv([makeContact()], ["email", "name"]);

    const lines = csv.replace(/^﻿/, "").split("\n");
    expect(lines[0]).toBe("E-mail;Nome");
    expect(lines[1]).toContain("maria@example.com");
    expect(lines[1]).not.toContain("vip");
  });

  it("escapes double quotes in field values", () => {
    const csv = buildContactsExportCsv([makeContact({ name: 'Maria "A" Silva' })], ["name"]);

    expect(csv).toContain('"Maria ""A"" Silva"');
  });
});
