package com.social.media.domain.content.repository;

import com.social.media.domain.content.aggregate.Media;
import com.social.media.domain.content.valueobject.MediaId;
import com.social.media.domain.content.valueobject.MediaType;
import com.social.media.domain.company.valueobject.CompanyId;
import com.social.media.domain.user.valueobject.UserId;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * Repository interface for Media aggregate
 */
public interface MediaRepository {
    
    Media save(Media media);
    
    Optional<Media> findById(MediaId id);
    
    List<Media> findByCompanyId(CompanyId companyId);
    
    List<Media> findByCompanyIdAndUploadedBy(CompanyId companyId, UserId uploadedBy);
    
    List<Media> findByCompanyIdAndMediaType(CompanyId companyId, MediaType mediaType);
    
    List<Media> findByCompanyIdAndIsPublic(CompanyId companyId, boolean isPublic);
    
    List<Media> findByCompanyIdAndUploadedAfter(CompanyId companyId, LocalDateTime uploadedAfter);
    
    List<Media> findByCompanyIdAndUploadedBetween(CompanyId companyId, LocalDateTime start, LocalDateTime end);
    
    List<Media> findByIds(List<MediaId> mediaIds);
    
    boolean existsByStoredFileName(String storedFileName);
    
    void delete(Media media);
    
    void deleteById(MediaId id);
    
    long countByCompanyId(CompanyId companyId);
    
    long getTotalFileSizeByCompanyId(CompanyId companyId);
    
    List<Media> findUnusedMediaByCompanyId(CompanyId companyId);
}
