package com.social.media.domain.bot.repository;

import com.social.media.domain.bot.aggregate.Bot;
import com.social.media.domain.bot.valueobject.BotId;
import com.social.media.domain.bot.valueobject.BotType;
import com.social.media.domain.bot.valueobject.BotStatus;
import com.social.media.domain.company.valueobject.CompanyId;
import com.social.media.domain.user.valueobject.UserId;
import com.social.media.domain.socialaccount.valueobject.SocialAccountId;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * Repository interface for Bot aggregate
 */
public interface BotRepository {
    
    Bot save(Bot bot);
    
    Optional<Bot> findById(BotId id);
    
    List<Bot> findByCompanyId(CompanyId companyId);
    
    List<Bot> findByCompanyIdAndStatus(CompanyId companyId, BotStatus status);
    
    List<Bot> findByCompanyIdAndBotType(CompanyId companyId, BotType botType);
    
    List<Bot> findByCompanyIdAndCreatedBy(CompanyId companyId, UserId createdBy);
    
    List<Bot> findActiveByCompanyId(CompanyId companyId);
    
    List<Bot> findRunningBots();
    
    List<Bot> findBotsScheduledForExecution();
    
    List<Bot> findBotsByTargetSocialAccount(SocialAccountId socialAccountId);
    
    List<Bot> findByCompanyIdAndNextExecutionBefore(CompanyId companyId, LocalDateTime dateTime);
    
    List<Bot> findByCompanyIdAndLastExecutionAfter(CompanyId companyId, LocalDateTime dateTime);
    
    boolean existsByNameAndCompanyId(String name, CompanyId companyId);
    
    boolean existsByNameAndCompanyIdAndIdNot(String name, CompanyId companyId, BotId excludeId);
    
    void delete(Bot bot);
    
    void deleteById(BotId id);
    
    long countByCompanyId(CompanyId companyId);
    
    long countByCompanyIdAndStatus(CompanyId companyId, BotStatus status);
    
    long countActiveByCompanyId(CompanyId companyId);
    
    long countRunningByCompanyId(CompanyId companyId);
}
