import { describe, it, expect, beforeEach } from "vitest";
import { ContactStatus } from "@prisma/client";
import { InMemoryContactsRepository } from "../repositories/in-memory-contacts-repository";
import { InMemoryContactListsRepository } from "../repositories/in-memory-contact-lists-repository";
import { BulkUpdateContactsUseCase } from "./bulk-update-contacts-use-case";

let contactsRepository: InMemoryContactsRepository;
let contactListsRepository: InMemoryContactListsRepository;
let sut: BulkUpdateContactsUseCase;

function seedContact(id: string) {
  contactsRepository.items.push({
    id,
    email: `${id}@example.com`,
    name: "Contact",
    lastName: null,
    phone: null,
    bairro: null,
    cidade: null,
    uf: null,
    idioma: null,
    empresa: null,
    cep: null,
    codigoEstabelecimento: null,
    nomeEstabelecimento: null,
    cdate: null,
    tags: [],
    source: "MANUAL",
    status: ContactStatus.ACTIVE,
    createdAt: new Date(),
    updatedAt: new Date(),
  });
}

describe("Bulk Update Contacts Use Case", () => {
  beforeEach(() => {
    contactsRepository = new InMemoryContactsRepository();
    contactListsRepository = new InMemoryContactListsRepository();
    sut = new BulkUpdateContactsUseCase(contactsRepository, contactListsRepository);
    seedContact("1");
    seedContact("2");
  });

  it("deletes the selected contacts in bulk", async () => {
    const result = await sut.execute({ body: { ids: ["1", "2"], action: "delete" } });

    expect(result.affected).toBe(2);
    expect(contactsRepository.items).toHaveLength(0);
  });

  it("adds tags to all selected contacts", async () => {
    const result = await sut.execute({
      body: { ids: ["1", "2"], action: "addTags", payload: { tags: ["vip"] } },
    });

    expect(result.affected).toBe(2);
    expect(contactsRepository.items.every((c) => c.tags.includes("vip"))).toBe(true);
  });

  it("adds all selected contacts to a list", async () => {
    const result = await sut.execute({
      body: { ids: ["1", "2"], action: "addToList", payload: { listId: "list-1" } },
    });

    expect(result.affected).toBe(2);
    expect(contactListsRepository.memberships).toHaveLength(2);
  });
});
