package infrastructure.mapper;

import application.port.input.command.UserLoginCommand;
import com.banesco.common.domain.model.BaseResponse;
import domain.model.UserLogin;
import infrastructure.client.userlogin.dto.request.UserLoginRequest;
import infrastructure.client.userlogin.dto.response.UserLoginResponse;
import infrastructure.config.RegisterSecurityConfig;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

/**
 * Clase de utilidad para mapear objetos entre las capas de la aplicación
 * para el flujo de validación de listas negras.
 */
@ApplicationScoped
public class UserLoginMapper {

    private final RegisterSecurityConfig config;

    @Inject
    public UserLoginMapper(RegisterSecurityConfig config) {
        this.config = config;
    }


    /**
     * Convierte la respuesta anidada de la API a la entidad de dominio.
     * @param dto La respuesta completa de la API, con la estructura BaseResponse.
     * @return Un objeto UserLogin del dominio.
     */
    public static UserLogin toEntity(BaseResponse<UserLoginResponse> dto) {
        if (dto == null || dto.getDataResponse() == null) {
            return null;
        }

        var data = dto.getDataResponse();

        if (data.getDataUser() != null) {
            return UserLogin.builder()
                    .usernameBol(data.getDataUser().getUsernameBol())
                    .usernameBOLE(data.getDataUser().getUsernameBOLE())
                    .build();
        } else {
            // Es la estructura de DEV
            return UserLogin.builder()
                    .usernameBol(data.getUsernameBol())
                    .usernameBOLE(data.getUsernameBOLE())
                    .build();
        }
    }

    public UserLoginRequest toRequestDto(UserLoginCommand command, String requestId) {
        if(command == null) {
            return null;
        }

        var userDataRequest = UserLoginRequest.DataUser.builder()
                .customerId(command.customerId())
                .customerIdType(command.customerIdType())
                .build();

        var dataRequest = UserLoginRequest.DataRequest.builder()
                .requestId(requestId)
                .sourceChannelCode(config.eventCod())
                .dataUser(userDataRequest)
                .build();

        return UserLoginRequest.builder()
                .dataRequest(dataRequest)
                .build();

    }
}