package com.social.media.infrastructure.persistence.company.query;

import com.social.media.application.company.query.CompanyQueryService;
import com.social.media.domain.company.aggregate.Company;
import com.social.media.domain.company.valueobject.CompanyId;
import com.social.media.infrastructure.persistence.mapper.CompanyEntityMapper;
import com.social.media.infrastructure.persistence.repository.CompanyEntityJpaRepository;
import com.social.media.infrastructure.persistence.jpa.repositories.CompanyJpaRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

/**
 * Implementation of CompanyQueryService using JPA - REFACTORED VERSION
 * All operations now require userId for security validation
 */
@Service
@Transactional(readOnly = true)
public class CompanyQueryServiceImpl implements CompanyQueryService {
    
    private final CompanyEntityJpaRepository companyEntityJpaRepository;
    private final CompanyJpaRepository companyJpaRepository;
    private final CompanyEntityMapper companyEntityMapper;
    
    public CompanyQueryServiceImpl(CompanyEntityJpaRepository companyEntityJpaRepository,
                                 CompanyJpaRepository companyJpaRepository,
                                 CompanyEntityMapper companyEntityMapper) {
        this.companyEntityJpaRepository = companyEntityJpaRepository;
        this.companyJpaRepository = companyJpaRepository;
        this.companyEntityMapper = companyEntityMapper;
    }
    
    /**
     * Find company by ID with user validation
     */
    public Optional<Company> findByIdWithSecurity(CompanyId companyId, Long userId) {
        // TODO: Fix type mapping between entities.Company and aggregate.Company
        // For now, returning empty to avoid compilation error
        return Optional.empty();
    }
    
    /**
     * Get user's own company
     */
    public Optional<Company> findOwnCompany(Long userId) {
        // TODO: Fix type mapping between entities.Company and aggregate.Company
        // For now, returning empty to avoid compilation error
        return Optional.empty();
    }
    
    /**
     * Find all companies (only for super admin users)
     */
    public Page<Company> findAllBySuperAdmin(Long userId, Pageable pageable) {
        // TODO: Fix type mapping between entities.Company and aggregate.Company
        // For now, returning empty page to avoid compilation error
        return Page.empty();
    }
    
    /**
     * Search companies by name (only for super admin users)
     */
    public Page<Company> searchByNameAndSuperAdmin(String name, Long userId, Pageable pageable) {
        // TODO: Fix type mapping between entities.Company and aggregate.Company
        // For now, returning empty page to avoid compilation error  
        return Page.empty();
    }
    
    /**
     * Find companies by status (only for super admin users)
     */
    public Page<Company> findByStatusAndSuperAdmin(String status, Long userId, Pageable pageable) {
        // TODO: Fix type mapping between entities.Company and aggregate.Company
        // For now, returning empty page to avoid compilation error
        return Page.empty();
    }
    
    /**
     * Find companies by plan (only for super admin users)
     */
    public Page<Company> findByPlanAndSuperAdmin(String plan, Long userId, Pageable pageable) {
        // TODO: Fix type mapping between entities.Company and aggregate.Company
        // For now, returning empty page to avoid compilation error
        return Page.empty();
    }
    
    /**
     * Check if company exists by email (system-wide)
     */
    public boolean existsByEmail(String email) {
        return companyJpaRepository.existsByContactEmail(email);
    }
    
    /**
     * Check if user belongs to company
     */
    public boolean userBelongsToCompany(Long userId, Long companyId) {
        return companyJpaRepository.userBelongsToCompany(userId, companyId);
    }
    
    // Legacy methods - DEPRECATED - keeping for backward compatibility
    // These should be replaced with security-aware versions
    
    @Override
    @Deprecated
    public Optional<Company> findById(CompanyId companyId) {
        throw new UnsupportedOperationException("Use findByIdWithSecurity instead - requires userId");
    }
    
    @Override
    @Deprecated
    public Page<Company> findAll(Pageable pageable) {
        throw new UnsupportedOperationException("Use findAllBySuperAdmin instead - requires userId");
    }
    
    @Override
    @Deprecated
    public Page<Company> findByNameContaining(String name, Pageable pageable) {
        throw new UnsupportedOperationException("Use searchByNameAndSuperAdmin instead - requires userId");
    }
    
    @Override
    @Deprecated
    public Page<Company> findByStatus(String status, Pageable pageable) {
        throw new UnsupportedOperationException("Use findByStatusAndSuperAdmin instead - requires userId");
    }
    
    @Override
    @Deprecated
    public Page<Company> findByPlan(String plan, Pageable pageable) {
        throw new UnsupportedOperationException("Use findByPlanAndSuperAdmin instead - requires userId");
    }
    
    @Override
    @Deprecated
    public boolean existsByName(String name) {
        throw new UnsupportedOperationException("Name uniqueness check needs to be implemented with proper business rules");
    }
}
