import { describe, it, expect, beforeEach } from "vitest";
import { SuppressionReason } from "@prisma/client";
import { InMemorySuppressedEmailsRepository } from "../repositories/in-memory-suppressed-emails-repository";
import { InMemorySesSuppressionProvider } from "@/modules/ses-webhooks/providers/in-memory-ses-suppression-provider";
import { RemoveSuppressedEmailUseCase } from "./remove-suppressed-email-use-case";

let suppressedEmailsRepository: InMemorySuppressedEmailsRepository;
let sesSuppressionProvider: InMemorySesSuppressionProvider;
let sut: RemoveSuppressedEmailUseCase;

describe("Remove Suppressed Email Use Case", () => {
  beforeEach(() => {
    suppressedEmailsRepository = new InMemorySuppressedEmailsRepository();
    sesSuppressionProvider = new InMemorySesSuppressionProvider();
    sut = new RemoveSuppressedEmailUseCase(suppressedEmailsRepository, sesSuppressionProvider);
  });

  it("should remove the email from both the local list and SES", async () => {
    await suppressedEmailsRepository.add("bounced@example.com", SuppressionReason.BOUNCE, "ses-webhook");
    await sesSuppressionProvider.putSuppressedDestination("bounced@example.com", "BOUNCE");

    const result = await sut.execute({ email: "bounced@example.com" });

    expect(result.success).toBe(true);
    expect(await suppressedEmailsRepository.isSuppressed("bounced@example.com")).toBe(false);
    expect(sesSuppressionProvider.suppressed.has("bounced@example.com")).toBe(false);
  });
});
