import { htmlToPlainText } from "@/modules/campaigns/entities/html-to-plain-text";
import { CampaignLogWithCampaignAndSenderName } from "@/modules/campaigns/repositories/campaign-logs-repository";
import { CampaignEngagementSummary } from "@/modules/ses-webhooks/repositories/email-events-repository";
import { deriveEmailEngagement } from "./derive-email-engagement";
import { truncatePreview } from "./truncate-preview";

export interface ContactEmailHistoryItem {
  logId: string;
  campaignId: string;
  subject: string;
  senderName: string;
  senderEmail: string;
  contactEmail: string;
  status: string;
  sentAt: string;
  preview: string;
  fullText: string;
  opened: boolean;
  openedAt: string | null;
  openCount: number;
  clickCount: number;
}

export function mapCampaignLogToEmailHistoryItem(
  log: CampaignLogWithCampaignAndSenderName,
  contactEmail: string,
  engagement: CampaignEngagementSummary | undefined
): ContactEmailHistoryItem {
  const fullText = htmlToPlainText(log.campaign.htmlBody);
  const derived = deriveEmailEngagement(
    engagement ?? { openCount: 0, clickCount: 0, firstOpenedAt: null }
  );

  return {
    logId: log.id,
    campaignId: log.campaignId,
    subject: log.campaign.subject,
    senderName: log.campaign.sender.name,
    senderEmail: log.campaign.sender.fromEmail,
    contactEmail,
    status: log.status,
    sentAt: (log.sentAt ?? log.createdAt).toISOString(),
    preview: truncatePreview(fullText),
    fullText,
    ...derived,
  };
}
