package com.social.media.domain.content.repository;

import com.social.media.domain.content.aggregate.Post;
import com.social.media.domain.content.valueobject.PostId;
import com.social.media.domain.content.valueobject.PostStatus;
import com.social.media.domain.content.valueobject.PostType;
import com.social.media.domain.content.valueobject.ContentCategoryId;
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 Post aggregate
 */
public interface PostRepository {
    
    Post save(Post post);
    
    Optional<Post> findById(PostId id);
    
    List<Post> findByCompanyId(CompanyId companyId);
    
    List<Post> findByCompanyIdAndStatus(CompanyId companyId, PostStatus status);
    
    List<Post> findByCompanyIdAndAuthorId(CompanyId companyId, UserId authorId);
    
    List<Post> findByCompanyIdAndCategoryId(CompanyId companyId, ContentCategoryId categoryId);
    
    List<Post> findByCompanyIdAndPostType(CompanyId companyId, PostType postType);
    
    List<Post> findScheduledPostsUntil(LocalDateTime dateTime);
    
    List<Post> findScheduledPostsByCompanyId(CompanyId companyId);
    
    List<Post> findPublishedPostsByCompanyId(CompanyId companyId);
    
    List<Post> findDraftPostsByCompanyId(CompanyId companyId);
    
    List<Post> findFailedPostsByCompanyId(CompanyId companyId);
    
    List<Post> findArchivedPostsByCompanyId(CompanyId companyId);
    
    List<Post> findPinnedPostsByCompanyId(CompanyId companyId);
    
    List<Post> findByCompanyIdAndCreatedBetween(CompanyId companyId, LocalDateTime start, LocalDateTime end);
    
    List<Post> findByCompanyIdAndPublishedBetween(CompanyId companyId, LocalDateTime start, LocalDateTime end);
    
    List<Post> findByTargetSocialAccount(SocialAccountId socialAccountId);
    
    List<Post> findByCompanyIdOrderByCreatedAtDesc(CompanyId companyId);
    
    List<Post> findByCompanyIdOrderByPublishedAtDesc(CompanyId companyId);
    
    List<Post> findByCompanyIdOrderByScheduledForAsc(CompanyId companyId);
    
    List<Post> findTop10MostEngagedByCompanyId(CompanyId companyId);
    
    boolean existsByContentTextAndCompanyId(String contentText, CompanyId companyId);
    
    void delete(Post post);
    
    void deleteById(PostId id);
    
    long countByCompanyId(CompanyId companyId);
    
    long countByCompanyIdAndStatus(CompanyId companyId, PostStatus status);
    
    long countPublishedPostsToday(CompanyId companyId);
    
    long countScheduledPosts(CompanyId companyId);
}
