import { describe, it, expect, beforeEach } from "vitest";
import { InMemoryCampaignsRepository } from "../repositories/in-memory-campaigns-repository";
import { InMemorySendersRepository } from "@/modules/senders/repositories/in-memory-senders-repository";
import { CreateCampaignUseCase } from "./create-campaign-use-case";

let campaignsRepository: InMemoryCampaignsRepository;
let sendersRepository: InMemorySendersRepository;
let sut: CreateCampaignUseCase;

describe("Create Campaign Use Case", () => {
  beforeEach(() => {
    campaignsRepository = new InMemoryCampaignsRepository();
    sendersRepository = new InMemorySendersRepository();
    sut = new CreateCampaignUseCase(campaignsRepository, sendersRepository);
  });

  it("should be able to create a campaign", async () => {
    const sender = await sendersRepository.create({
      name: "John Doe",
      fromEmail: "john@example.com",
      provider: "SMTP",
      smtpHost: "smtp.example.com",
      smtpPort: 587,
      smtpUser: "john@example.com",
      userId: "user-1",
      encryptedPass: "encrypted-secret",
    });

    const { campaign } = await sut.execute({
      userId: "user-1",
      body: {
        title: "Test Campaign",
        subject: "Welcome Offer",
        htmlBody: "<p>Hello World</p>",
        senderId: sender.id,
      },
    });

    expect(campaign.id).toEqual(expect.any(String));
    expect(campaign.title).toEqual("Test Campaign");
  });
});
