package com.social.media.domain.campaign.repository;

import com.social.media.domain.campaign.entity.CampaignExecution;
import com.social.media.domain.campaign.valueobject.*;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * Campaign Execution Repository Interface
 * Defines operations for persisting and retrieving campaign executions
 */
public interface CampaignExecutionRepository {
    
    // Basic CRUD operations
    CampaignExecution save(CampaignExecution execution);
    Optional<CampaignExecution> findById(CampaignExecutionId executionId);
    void deleteById(CampaignExecutionId executionId);
    boolean existsById(CampaignExecutionId executionId);
    
    // Campaign-specific queries
    List<CampaignExecution> findByCampaignId(AutomationCampaignId campaignId);
    List<CampaignExecution> findByCampaignIdAndStatus(AutomationCampaignId campaignId, ExecutionStatus status);
    List<CampaignExecution> findByCampaignIdAndActionType(AutomationCampaignId campaignId, ActionType actionType);
    
    // Status-based queries
    List<CampaignExecution> findByStatus(ExecutionStatus status);
    List<CampaignExecution> findPendingExecutions();
    List<CampaignExecution> findFailedExecutions();
    List<CampaignExecution> findRetryableExecutions();
    
    // Time-based queries
    List<CampaignExecution> findByExecutionTimeBetween(LocalDateTime start, LocalDateTime end);
    List<CampaignExecution> findByCompletionTimeBetween(LocalDateTime start, LocalDateTime end);
    List<CampaignExecution> findExecutionsAfter(LocalDateTime dateTime);
    
    // Target-based queries
    List<CampaignExecution> findByTargetUsername(String targetUsername);
    List<CampaignExecution> findBySocialAccountId(Long socialAccountId);
    
    // Rate limiting queries
    List<CampaignExecution> findRateLimitedExecutions();
    List<CampaignExecution> findExecutionsWithRateLimitResetBefore(LocalDateTime dateTime);
    
    // Error analysis
    List<CampaignExecution> findByErrorCode(String errorCode);
    List<CampaignExecution> findExecutionsWithErrors();
    
    // Pagination support
    List<CampaignExecution> findByCampaignIdWithPagination(AutomationCampaignId campaignId, int page, int size);
    List<CampaignExecution> findByStatusWithPagination(ExecutionStatus status, int page, int size);
    
    // Statistics
    long countByCampaignId(AutomationCampaignId campaignId);
    long countByCampaignIdAndStatus(AutomationCampaignId campaignId, ExecutionStatus status);
    long countByActionType(ActionType actionType);
    long countSuccessfulExecutions(AutomationCampaignId campaignId);
    long countFailedExecutions(AutomationCampaignId campaignId);
    
    // Batch operations
    List<CampaignExecution> saveAll(List<CampaignExecution> executions);
    void deleteAllByCampaignId(AutomationCampaignId campaignId);
    
    // Metrics and analytics
    List<CampaignExecution> findExecutionsForMetricsCalculation(AutomationCampaignId campaignId);
    List<CampaignExecution> findRecentExecutions(LocalDateTime since);
}
