import { CampaignLogsRepository } from "@/modules/campaigns/repositories/campaign-logs-repository";
import { EmailEventsRepository } from "../repositories/email-events-repository";

interface RecordEmailOpenUseCaseRequest {
  logId: string;
  userAgent: string | null;
  ip: string | null;
}

/**
 * Grava uma abertura de e-mail a partir do token do pixel de rastreamento (ver
 * `build-email-content.ts` e a rota `GET /api/track/open/[token]`). Usado apenas para envios
 * SMTP — envios via SES já são registrados pelo webhook (`HandleSesNotificationUseCase`).
 *
 * Nunca lança: o pixel precisa responder 200 sempre, então qualquer falha aqui (token
 * inexistente, erro de banco) é silenciosamente ignorada pela própria rota — este use-case só
 * decide "gravar ou não", nunca propaga um erro que mudaria a resposta HTTP.
 */
export class RecordEmailOpenUseCase {
  constructor(
    private campaignLogsRepository: CampaignLogsRepository,
    private emailEventsRepository: EmailEventsRepository
  ) {}

  async execute({ logId, userAgent, ip }: RecordEmailOpenUseCaseRequest): Promise<void> {
    const ids = await this.campaignLogsRepository.findCampaignAndContactIdsByLogId(logId);
    if (!ids) {
      return;
    }

    await this.emailEventsRepository.create({
      type: "OPEN",
      messageId: `pixel:${logId}:${Date.now()}`,
      campaignId: ids.campaignId,
      contactId: ids.contactId,
      payload: {
        source: "pixel",
        logId,
        userAgent,
        ip,
      },
    });
  }
}
