package com.social.media.application.ports;

import com.social.media.domain.user.User;
import com.social.media.domain.shared.enums.UserRole;
import com.social.media.domain.shared.enums.UserStatus;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * Repository interface for User aggregate.
 * Defines the contract for User persistence operations.
 */
public interface UserRepository {
    
    /**
     * Save a user entity
     */
    User save(User user);
    
    /**
     * Find a user by its ID
     */
    Optional<User> findById(UUID id);
    
    /**
     * Find a user by its CPF
     */
    Optional<User> findByCpf(String cpf);
    
    /**
     * Find a user by its email
     */
    Optional<User> findByEmail(String email);
    
    /**
     * Find a user by its username
     */
    Optional<User> findByUsername(String username);
    
    /**
     * Find a user by login (email or CPF or username)
     */
    Optional<User> findByLogin(String login);
    
    /**
     * Check if a user exists with the given CPF
     */
    boolean existsByCpf(String cpf);
    
    /**
     * Check if a user exists with the given email
     */
    boolean existsByEmail(String email);
    
    /**
     * Check if a user exists with the given username
     */
    boolean existsByUsername(String username);
    
    /**
     * Check if a user exists by email in a specific company
     */
    boolean existsByEmailAndCompanyId(String email, UUID companyId);
    
    /**
     * Find users by company ID
     */
    List<User> findByCompanyId(UUID companyId);
    
    /**
     * Find users by company ID and role
     */
    List<User> findByCompanyIdAndRole(UUID companyId, UserRole role);
    
    /**
     * Find users by company ID and status
     */
    List<User> findByCompanyIdAndStatus(UUID companyId, UserStatus status);
    
    /**
     * Find users with filtering, sorting and pagination
     */
    List<User> findWithFilters(
        UUID companyId,
        UserRole role,
        UserStatus status,
        String department,
        int page,
        int size,
        String sortBy,
        String sortDirection
    );
    
    /**
     * Count users with filters for pagination
     */
    long countWithFilters(
        UUID companyId,
        UserRole role,
        UserStatus status,
        String department
    );
    
    /**
     * Find all users by role
     */
    List<User> findByRole(UserRole role);
    
    /**
     * Find all users by status
     */
    List<User> findByStatus(UserStatus status);
    
    /**
     * Find users by manager ID
     */
    List<User> findByManagerId(UUID managerId);
    
    /**
     * Find active users by company
     */
    List<User> findActiveUsersByCompany(UUID companyId);
    
    /**
     * Find users by name containing text
     */
    List<User> findByCompanyIdAndFullNameContaining(UUID companyId, String name);
    
    /**
     * Count users by company ID
     */
    long countByCompanyId(UUID companyId);
    
    /**
     * Count active users by company ID
     */
    long countActiveUsersByCompanyId(UUID companyId);
    
    /**
     * Count users by company and status
     */
    long countByCompanyIdAndStatus(UUID companyId, UserStatus status);
    
    /**
     * Count users by company and role
     */
    long countByCompanyIdAndRole(UUID companyId, UserRole role);
    
    /**
     * Delete a user by its ID
     */
    void deleteById(UUID id);
    
    /**
     * Find all users
     */
    List<User> findAll();
}
