package com.social.media.infrastructure.persistence.mapper;

import com.social.media.domain.company.aggregate.Company;
import com.social.media.domain.company.valueobject.*;
import com.social.media.domain.shared.valueobject.Email;
import com.social.media.domain.shared.valueobject.Phone;
import com.social.media.infrastructure.persistence.entity.CompanyEntity;
import com.social.media.infrastructure.persistence.entity.CompanyPlanEntity;
import com.social.media.infrastructure.persistence.entity.CompanyStatusEntity;
import org.springframework.stereotype.Component;

/**
 * Mapper between Company domain aggregate and CompanyEntity
 */
@Component
public class CompanyEntityMapper {
    
    /**
     * Convert Company domain aggregate to CompanyEntity
     */
    public CompanyEntity toEntity(Company company) {
        if (company == null) {
            return null;
        }
        
        CompanyEntity entity = new CompanyEntity();
        entity.setId(company.getId().value());
        entity.setName(company.getName());
        entity.setEmail(company.getEmail().value());
        entity.setCnpj(company.getCnpj().value());
        entity.setPhone(company.getPhone() != null ? company.getPhone().value() : null);
        entity.setWebsite(company.getWebsite());
        entity.setActivitySector(company.getActivitySector());
        entity.setPlan(mapToEntityPlan(company.getActivePlan()));
        entity.setStatus(mapToEntityStatus(company.getStatus()));
        
        // Map address if present
        if (company.getAddress() != null) {
            Address address = company.getAddress();
            entity.setAddressStreet(address.street());
            entity.setAddressNumber(address.number());
            entity.setAddressComplement(address.complement());
            entity.setAddressNeighborhood(address.neighborhood());
            entity.setAddressCity(address.city());
            entity.setAddressState(address.state());
            entity.setAddressZipCode(address.zipCode());
            entity.setAddressCountry(address.country());
        }
        
        // Map audit fields
        entity.setCreatedAt(company.getCreatedAt());
        entity.setUpdatedAt(company.getUpdatedAt());
        
        return entity;
    }
    
    /**
     * Convert CompanyEntity to Company domain aggregate
     */
    public Company toDomain(CompanyEntity entity) {
        if (entity == null) {
            return null;
        }
        
        // Create value objects
        CompanyId id = new CompanyId(entity.getId());
        Email email = new Email(entity.getEmail());
        Cnpj cnpj = new Cnpj(entity.getCnpj());
        Phone phone = entity.getPhone() != null ? new Phone(entity.getPhone()) : null;
        CompanyPlan plan = mapToDomainPlan(entity.getPlan());
        CompanyStatus status = mapToDomainStatus(entity.getStatus());
        
        // Create address if present
        Address address = null;
        if (entity.getAddressStreet() != null || entity.getAddressCity() != null) {
            address = new Address(
                entity.getAddressStreet(),
                entity.getAddressNumber(),
                entity.getAddressComplement(),
                entity.getAddressNeighborhood(),
                entity.getAddressCity(),
                entity.getAddressState(),
                entity.getAddressZipCode(),
                entity.getAddressCountry()
            );
        }
        
        return Company.reconstruct(
            id,
            entity.getName(),
            cnpj,
            null, // stateRegistration not mapped
            phone,
            email,
            address,
            null, // logoUrl not mapped
            entity.getWebsite(),
            entity.getActivitySector(),
            plan,
            null, // socialAccountsLimit calculated from plan
            null, // monthlyPostsLimit calculated from plan
            null, // registrationDate not mapped
            null, // expirationDate not mapped
            status,
            false, // deleted not mapped (using soft delete pattern)
            entity.getCreatedAt(),
            entity.getUpdatedAt()
        );
    }
    
    // Helper methods for enum conversion
    private CompanyPlanEntity mapToEntityPlan(CompanyPlan plan) {
        return switch (plan) {
            case BASICO -> CompanyPlanEntity.BASIC;
            case PREMIUM -> CompanyPlanEntity.PREMIUM;
            case ENTERPRISE -> CompanyPlanEntity.ENTERPRISE;
        };
    }
    
    private CompanyPlan mapToDomainPlan(CompanyPlanEntity plan) {
        return switch (plan) {
            case FREE -> CompanyPlan.BASICO; // Map FREE to BASICO
            case BASIC -> CompanyPlan.BASICO;
            case PREMIUM -> CompanyPlan.PREMIUM;
            case ENTERPRISE -> CompanyPlan.ENTERPRISE;
        };
    }
    
    private CompanyStatusEntity mapToEntityStatus(CompanyStatus status) {
        return switch (status) {
            case ATIVO -> CompanyStatusEntity.ACTIVE;
            case INATIVO -> CompanyStatusEntity.INACTIVE;
            case SUSPENSO -> CompanyStatusEntity.SUSPENDED;
            case CANCELADO -> CompanyStatusEntity.PENDING; // Map CANCELADO to PENDING
        };
    }
    
    private CompanyStatus mapToDomainStatus(CompanyStatusEntity status) {
        return switch (status) {
            case ACTIVE -> CompanyStatus.ATIVO;
            case INACTIVE -> CompanyStatus.INATIVO;
            case SUSPENDED -> CompanyStatus.SUSPENSO;
            case PENDING -> CompanyStatus.CANCELADO; // Map PENDING to CANCELADO
        };
    }
}
