import { Campaign, CampaignLog, CampaignStatus, Contact, ContactList, Domain, Sender } from "@prisma/client";
import { CreateCampaignDTO } from "../dtos/create-campaign-dto";
import { UpdateCampaignDTO } from "../dtos/update-campaign-dto";

export type CampaignWithLogsAndSender = Campaign & {
  sender: Pick<Sender, "id" | "name" | "fromEmail">;
  contactList: Pick<ContactList, "id" | "name"> | null;
  logs: (CampaignLog & {
    contact: Pick<Contact, "id" | "email" | "name">;
  })[];
};

export type CampaignWithSender = Campaign & {
  sender: Sender & { domain: Domain | null };
  contactList: Pick<ContactList, "id" | "name"> | null;
};

export type CampaignWithSenderName = Campaign & { sender: Pick<Sender, "name"> };

export interface CampaignsRepository {
  create(data: CreateCampaignDTO): Promise<Campaign>;
  findById(id: string): Promise<Campaign | null>;
  findByIdWithSender(id: string): Promise<CampaignWithSender | null>;
  findByIdWithLogsAndSender(id: string): Promise<CampaignWithLogsAndSender | null>;
  findByUserId(userId: string): Promise<CampaignWithSenderName[]>;
  searchByUserId(userId: string, query: string, limit: number): Promise<CampaignWithSenderName[]>;
  update(id: string, data: UpdateCampaignDTO): Promise<Campaign>;
  updateStatus(id: string, status: CampaignStatus): Promise<Campaign>;
}
