package com.social.media.application.ports;

import com.social.media.domain.company.Company;
import com.social.media.domain.shared.enums.CompanyStatus;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * Repository interface for Company aggregate.
 * Defines the contract for Company persistence operations.
 */
public interface CompanyRepository {
    
    /**
     * Save a company entity
     */
    Company save(Company company);
    
    /**
     * Find a company by its ID
     */
    Optional<Company> findById(UUID id);
    
    /**
     * Find a company by its CNPJ
     */
    Optional<Company> findByCnpj(String cnpj);
    
    /**
     * Find a company by its email
     */
    Optional<Company> findByEmail(String email);
    
    /**
     * Check if a company exists with the given CNPJ
     */
    boolean existsByCnpj(String cnpj);
    
    /**
     * Check if a company exists with the given email
     */
    boolean existsByEmail(String email);
    
    /**
     * Find companies with filtering, sorting and pagination
     */
    List<Company> findWithFilters(
        CompanyStatus status,
        String plan,
        String activitySector,
        int page,
        int size,
        String sortBy,
        String sortDirection
    );
    
    /**
     * Count companies with filters for pagination
     */
    long countWithFilters(
        CompanyStatus status,
        String plan,
        String activitySector
    );
    
    /**
     * Find all companies by status
     */
    List<Company> findByStatus(String status);
    
    /**
     * Find all companies by plan
     */
    List<Company> findByPlan(String plan);
    
    /**
     * Find all active companies
     */
    List<Company> findActiveCompanies();
    
    /**
     * Find companies by name containing the given text
     */
    List<Company> findByNameContaining(String name);
    
    /**
     * Delete a company by its ID
     */
    void deleteById(UUID id);
    
    /**
     * Count total number of companies
     */
    long count();
    
    /**
     * Count companies by status
     */
    long countByStatus(String status);
    
    /**
     * Find all companies
     */
    List<Company> findAll();
}
