package com.social.media.interfaces.web.mapper;

import com.social.media.application.company.command.CreateCompanyCommand;
import com.social.media.application.company.command.UpdateCompanyCommand;
import com.social.media.domain.company.aggregate.Company;
import com.social.media.domain.company.valueobject.CompanyId;
import com.social.media.domain.company.valueobject.CompanyPlan;
import com.social.media.interfaces.web.dto.company.CompanyResponse;
import com.social.media.interfaces.web.dto.company.CreateCompanyRequest;
import com.social.media.interfaces.web.dto.company.UpdateCompanyRequest;
import org.springframework.stereotype.Component;

import java.util.UUID;

/**
 * Mapper between Company DTOs and domain/application objects
 */
@Component
public class CompanyDtoMapper {
    
    /**
     * Convert CreateCompanyRequest to CreateCompanyCommand
     */
    public CreateCompanyCommand toCreateCommand(CreateCompanyRequest request) {
        return new CreateCompanyCommand(
                "00000000000000", // cnpj - temporary default, should be added to request
                request.name(),   // companyName
                request.name(),   // tradeName - using same as company name
                request.email(),  // email
                request.phone(),  // phoneNumber
                request.website(), // website
                "Technology",     // activitySector - temporary default, should be added to request  
                request.plan(),   // plan as String (will be converted to enum in handler)
                "",               // street
                "",               // number
                "",               // complement
                "",               // neighborhood
                "",               // city
                "",               // state
                "",               // postalCode
                "",               // country
                null              // createdByUserId
        );
    }
    
    /**
     * Convert UpdateCompanyRequest to UpdateCompanyCommand
     */
    public UpdateCompanyCommand toUpdateCommand(CompanyId companyId, UpdateCompanyRequest request) {
        // Convert CompanyId (Long) to UUID for the command
        UUID uuid = new UUID(companyId.value(), 0L); // Create UUID from Long ID
        
        return new UpdateCompanyCommand(
                uuid,             // companyId as UUID
                request.name(),   // companyName
                request.name(),   // tradeName - using same as company name
                request.email(),  // email
                request.phone(),  // phoneNumber
                request.website(), // website
                "Technology",     // activitySector - temporary default
                "",               // street
                "",               // number
                "",               // complement
                "",               // neighborhood
                "",               // city
                "",               // state
                "",               // postalCode
                "",               // country
                null              // updatedByUserId
        );
    }
    
    /**
     * Convert Company aggregate to CompanyResponse
     */
    public CompanyResponse toResponse(Company company) {
        return new CompanyResponse(
                company.getId().value(),  // Extract UUID from CompanyId
                company.getName(),
                company.getEmail().value(),
                company.getPhone() != null ? company.getPhone().value() : null,
                company.getWebsite(),
                company.getActivitySector(), // Using activitySector as description
                company.getActivePlan().name(),
                company.getStatus().name(),
                company.getCreatedAt(),
                company.getUpdatedAt()
        );
    }
}
