package com.banesco.module.service_issue_payment_status.application.service;

import com.banesco.common.application.helper.MessageHelper;
import com.banesco.common.application.helper.RequestValidatorHelper;
import com.banesco.common.domain.exception.HttpStatusCodeException;
import com.banesco.common.domain.model.ApiResponse;
import com.banesco.module.service_issue_payment_status.application.usecase.BusinessUseCase;
import com.banesco.module.service_issue_payment_status.application.usecase.ServiceIssuePaymentStatusUseCase;
import com.banesco.module.service_issue_payment_status.domain.dto.request.ServiceIssuePaymentStatusRequest;
import com.banesco.module.service_issue_payment_status.domain.dto.response.ServiceIssuePaymentStatusResponse;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@ApplicationScoped
public class ServiceIssuePaymentStatusService implements ServiceIssuePaymentStatusUseCase {

    private final MessageHelper messageHelper;
    private final RequestValidatorHelper requestValidatorHelper;
    private final BusinessUseCase businessUseCase;

    @Inject
    public ServiceIssuePaymentStatusService(
        MessageHelper messageHelper,
        RequestValidatorHelper requestValidatorHelper,
        BusinessUseCase businessUseCase
    ) {
        this.messageHelper = messageHelper;
        this.requestValidatorHelper = requestValidatorHelper;
        this.businessUseCase = businessUseCase;
    }

    @Override
    public Response execute(
        ServiceIssuePaymentStatusRequest request
    ) {
        log.info("Iniciando ejecucion para el transaccion: {}", request.getId());

        Response response;

        try {
            validate(request);

            ApiResponse<ServiceIssuePaymentStatusResponse> apiResponse = business(request);

            response = messageHelper.handleSuccess(
                apiResponse.getData(),
                apiResponse.getStatusResponse().getStatusCode()
            );
        } catch (HttpStatusCodeException e) {
            log.error("Excepcion HTTP del api de negocio: {} - {}", e.getStatusCode(), e.getErrorCode());
            response = messageHelper.handleException(e);
        } catch (Exception e) {
            log.error("Excepcion generica del api de negocio: {}", e.getMessage());
            response = messageHelper.handleGenericException(e);
        }

        return response;
    }

    private void validate(
        ServiceIssuePaymentStatusRequest request
    ) {
        requestValidatorHelper.validateRequired(request);
        requestValidatorHelper.validateFieldValues(request);
    }

    private ApiResponse<ServiceIssuePaymentStatusResponse> business(
        ServiceIssuePaymentStatusRequest request
    ) {
        log.info("Ejecutando llamada al api de negocio: {}", request.getAppId());
        return businessUseCase.execute(request, ServiceIssuePaymentStatusResponse.class);
    }
}