package com.social.media.application.company.handler;

import com.social.media.application.company.command.UpdateCompanyCommand;
import com.social.media.application.ports.CompanyRepository;
import com.social.media.domain.company.Company;
import com.social.media.domain.company.Email;
import com.social.media.domain.company.Address;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 * Handler for updating company information.
 * Implements complete business logic for company updates.
 */
@Component
public class UpdateCompanyHandler {
    
    private final CompanyRepository companyRepository;
    
    public UpdateCompanyHandler(CompanyRepository companyRepository) {
        this.companyRepository = companyRepository;
    }
    
    @Transactional
    public void handle(UpdateCompanyCommand command) {
        // Find existing company
        Company company = companyRepository.findById(command.companyId())
            .orElseThrow(() -> new IllegalArgumentException("Company not found with ID: " + command.companyId()));
        
        // Validate business rules
        validateBusinessRules(command, company);
        
        // Update company information using available methods
        company.updateBasicInfo(
            command.companyName(),
            command.phoneNumber(),
            command.website(),
            command.activitySector()
        );
        
        // Update email if changed
        if (!company.getEmail().getValue().equals(command.email())) {
            company.updateEmail(command.email());
        }
        
        // Update address
        Address newAddress = new Address(
            command.street(),
            command.number(),
            command.complement(),
            command.neighborhood(),
            command.city(),
            command.state(),
            command.postalCode(),
            command.country() != null ? command.country() : "Brazil"
        );
        company.updateAddress(newAddress);
        
        // Save updated company
        companyRepository.save(company);
        
        // TODO: Publish domain event for company update
        // publishCompanyUpdatedEvent(company, command.updatedByUserId());
    }
    
    private void validateBusinessRules(UpdateCompanyCommand command, Company existingCompany) {
        // Check if email already exists for another company
        if (!existingCompany.getEmail().getValue().equals(command.email())) {
            if (companyRepository.existsByEmail(command.email())) {
                throw new IllegalArgumentException("A company with this email already exists");
            }
        }
        
        // Additional business rules can be added here
    }
    
    // TODO: Implement event publishing
    // private void publishCompanyUpdatedEvent(Company company, UUID updatedByUserId) {
    //     CompanyUpdatedEvent event = new CompanyUpdatedEvent(
    //         company.getId(),
    //         company.getCompanyName(),
    //         company.getEmail().getValue(),
    //         updatedByUserId,
    //         LocalDateTime.now()
    //     );
    //     eventPublisher.publish(event);
    // }
}
