package com.social.media.domain.company.repository;

import com.social.media.domain.company.aggregate.Company;
import com.social.media.domain.company.valueobject.*;
import com.social.media.domain.shared.valueobject.Email;

import java.util.List;
import java.util.Optional;

/**
 * Repository interface for Company aggregate
 * This is a port in the hexagonal architecture
 */
public interface CompanyRepository {
    
    /**
     * Save a company (create or update)
     */
    Company save(Company company);
    
    /**
     * Find company by ID
     */
    Optional<Company> findById(CompanyId id);
    
    /**
     * Find company by email
     */
    Optional<Company> findByEmail(Email email);
    
    /**
     * Find company by CNPJ
     */
    Optional<Company> findByCnpj(Cnpj cnpj);
    
    /**
     * Check if email exists (for validation)
     */
    boolean existsByEmail(Email email);
    
    /**
     * Check if CNPJ exists (for validation)
     */
    boolean existsByCnpj(Cnpj cnpj);
    
    /**
     * Find companies by status
     */
    List<Company> findByStatus(CompanyStatus status);
    
    /**
     * Find companies by plan
     */
    List<Company> findByPlan(CompanyPlan plan);
    
    /**
     * Find active companies (not deleted)
     */
    List<Company> findActiveCompanies();
    
    /**
     * Find companies by activity sector
     */
    List<Company> findByActivitySector(String activitySector);
    
    /**
     * Delete company (hard delete - use with caution)
     */
    void delete(CompanyId id);
    
    /**
     * Get total count of companies
     */
    long countCompanies();
    
    /**
     * Get count of active companies
     */
    long countActiveCompanies();
    
    /**
     * Get count by plan type
     */
    long countByPlan(CompanyPlan plan);
}
