import { CampaignsRepository } from "../repositories/campaigns-repository";
import { CampaignLogsRepository } from "../repositories/campaign-logs-repository";

interface GetCampaignsSummaryByUserUseCaseRequest {
  userId: string;
}

export interface CampaignsSummary {
  campaignsCount: number;
  total: number;
  success: number;
  failed: number;
  pending: number;
}

interface GetCampaignsSummaryByUserUseCaseResponse {
  summary: CampaignsSummary;
}

export class GetCampaignsSummaryByUserUseCase {
  constructor(
    private campaignsRepository: CampaignsRepository,
    private campaignLogsRepository: CampaignLogsRepository
  ) {}

  async execute({
    userId,
  }: GetCampaignsSummaryByUserUseCaseRequest): Promise<GetCampaignsSummaryByUserUseCaseResponse> {
    const campaigns = await this.campaignsRepository.findByUserId(userId);
    const campaignIds = campaigns.map((campaign) => campaign.id);
    const logCounts = await this.campaignLogsRepository.countByStatusForCampaignIds(campaignIds);

    return {
      summary: {
        campaignsCount: campaigns.length,
        total: logCounts.total,
        success: logCounts.success,
        failed: logCounts.failed,
        pending: logCounts.pending,
      },
    };
  }
}
