import { describe, it, expect, beforeEach } from "vitest";
import { InMemoryCampaignLogsRepository } from "@/modules/campaigns/repositories/in-memory-campaign-logs-repository";
import { InMemoryEmailEventsRepository } from "../repositories/in-memory-email-events-repository";
import { RecordEmailOpenUseCase } from "./record-email-open-use-case";

let campaignLogsRepository: InMemoryCampaignLogsRepository;
let emailEventsRepository: InMemoryEmailEventsRepository;
let sut: RecordEmailOpenUseCase;

describe("Record Email Open Use Case", () => {
  beforeEach(() => {
    campaignLogsRepository = new InMemoryCampaignLogsRepository();
    emailEventsRepository = new InMemoryEmailEventsRepository();
    sut = new RecordEmailOpenUseCase(campaignLogsRepository, emailEventsRepository);
  });

  it("records an OPEN event when the token matches a real campaign log", async () => {
    const log = await campaignLogsRepository.upsertPending("campaign-1", "contact-1");

    await sut.execute({ logId: log.id, userAgent: "Mozilla/5.0", ip: "1.2.3.4" });

    expect(emailEventsRepository.items).toHaveLength(1);
    expect(emailEventsRepository.items[0].type).toBe("OPEN");
    expect(emailEventsRepository.items[0].campaignId).toBe("campaign-1");
    expect(emailEventsRepository.items[0].contactId).toBe("contact-1");
  });

  it("silently does nothing for an unknown/malformed token", async () => {
    await sut.execute({ logId: "does-not-exist", userAgent: null, ip: null });

    expect(emailEventsRepository.items).toHaveLength(0);
  });
});
