package com.social.media.domain.campaign.repository;

import com.social.media.domain.campaign.aggregate.AutomationCampaign;
import com.social.media.domain.campaign.valueobject.AutomationCampaignId;
import com.social.media.domain.campaign.valueobject.CampaignStatus;
import com.social.media.domain.campaign.valueobject.CampaignType;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * Automation Campaign Repository Interface
 * Defines operations for persisting and retrieving automation campaigns
 */
public interface AutomationCampaignRepository {
    
    // Basic CRUD operations
    AutomationCampaign save(AutomationCampaign campaign);
    Optional<AutomationCampaign> findById(AutomationCampaignId campaignId);
    void deleteById(AutomationCampaignId campaignId);
    boolean existsById(AutomationCampaignId campaignId);
    
    // Query operations
    List<AutomationCampaign> findByCompanyId(Long companyId);
    List<AutomationCampaign> findBySocialAccountId(Long socialAccountId);
    List<AutomationCampaign> findByStatus(CampaignStatus status);
    List<AutomationCampaign> findByType(CampaignType type);
    
    // Company-specific queries
    List<AutomationCampaign> findByCompanyIdAndStatus(Long companyId, CampaignStatus status);
    List<AutomationCampaign> findByCompanyIdAndType(Long companyId, CampaignType type);
    Optional<AutomationCampaign> findByCompanyIdAndName(Long companyId, String name);
    boolean existsByCompanyIdAndName(Long companyId, String name);
    boolean existsByCampaignCode(String campaignCode);
    
    // Status-based queries
    List<AutomationCampaign> findActiveCampaigns();
    List<AutomationCampaign> findScheduledCampaigns(LocalDateTime from, LocalDateTime to);
    List<AutomationCampaign> findExpiredCampaigns(LocalDateTime before);
    List<AutomationCampaign> findCampaignsRequiringExecution();
    
    // Pagination support
    List<AutomationCampaign> findByCompanyIdWithPagination(Long companyId, int page, int size);
    List<AutomationCampaign> findByStatusWithPagination(CampaignStatus status, int page, int size);
    
    // Statistics
    long countByCompanyId(Long companyId);
    long countByCompanyIdAndStatus(Long companyId, CampaignStatus status);
    long countActiveCampaigns();
    
    // Complex queries
    List<AutomationCampaign> findCampaignsForExecution(LocalDateTime executionTime);
    List<AutomationCampaign> findCampaignsByDateRange(LocalDateTime startDate, LocalDateTime endDate);
}
