import { EmailEvent, EmailEventType } from "@prisma/client";

export interface CreateEmailEventInput {
  type: EmailEventType;
  messageId: string;
  campaignId?: string | null;
  contactId?: string | null;
  payload: unknown;
}

export interface AnalyticsEmailEvent {
  type: EmailEventType;
  createdAt: Date;
}

export interface CampaignEngagementSummary {
  campaignId: string;
  openCount: number;
  clickCount: number;
  firstOpenedAt: Date | null;
}

export interface CampaignOpenStats {
  totalOpens: number;
  uniqueOpens: number;
}

export interface CampaignOpenerSummary {
  contactId: string;
  firstOpenedAt: Date;
  openCount: number;
}

export interface CampaignOpenEvent {
  createdAt: Date;
}

export interface EmailEventsRepository {
  create(data: CreateEmailEventInput): Promise<EmailEvent>;
  findEventsForAnalytics(
    campaignIds: string[],
    startDate?: Date,
    endDate?: Date
  ): Promise<AnalyticsEmailEvent[]>;
  /**
   * Agrega, numa única consulta, quantas aberturas/cliques um contato teve por campanha —
   * evita N+1 ao montar o histórico de e-mails do contato (uma chamada para todas as
   * `campaignIds` da página atual, não uma por envio).
   */
  findEngagementByContactAndCampaignIds(
    contactId: string,
    campaignIds: string[]
  ): Promise<CampaignEngagementSummary[]>;
  /** Total de aberturas e aberturas únicas (por contato) de uma campanha específica. */
  getCampaignOpenStats(campaignId: string): Promise<CampaignOpenStats>;
  /** Um item por contato que abriu a campanha, com a data da primeira abertura e a contagem total. */
  findOpenersByCampaignId(campaignId: string): Promise<CampaignOpenerSummary[]>;
  /** Timestamps brutos de todas as aberturas da campanha, para montar a linha do tempo. */
  findOpenEventsByCampaignId(campaignId: string): Promise<CampaignOpenEvent[]>;
}
