package application.usecase;

import application.exception.GatewayServiceException;
import application.exception.InvalidTokenException;
import application.port.input.IValidateOtp;
import application.port.input.command.ValidateOtpCommand;
import com.banesco.common.infraestructure.helpers.LoggerHelper;
import domain.repository.IOtpPort;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import lombok.extern.slf4j.Slf4j;
import org.jboss.resteasy.reactive.RestResponse;

@Slf4j
@ApplicationScoped
public class ValidateOtpUseCase implements IValidateOtp {

    private final IOtpPort otpApiPort;

    @Inject
    public ValidateOtpUseCase(IOtpPort otpApiService) {
        this.otpApiPort = otpApiService;
    }

    /**
     * Orquesta la validación de un token OTP.
     * Encapsula la lógica de negocio para determinar si un OTP es válido,
     * manejando también los fallos de comunicación con el servicio externo.
     *
     * @param command El comando con los datos necesarios para validar el OTP.
     * @param requestId El ID de la solicitud para trazabilidad.
     * @return {@code true} si el servicio externo responde con un status HTTP 200 (OK),
     * {@code false} en cualquier otro caso (respuesta de error o fallo de comunicación).
     */
    @Override
    public Boolean isValidOtp(ValidateOtpCommand command, String requestId) {
        log.debug(LoggerHelper.buildInfoPrivateRequest(requestId, "Iniciando caso de uso: Validate OTP"));

        try {
            var apiResponse = otpApiPort.validateOtp(command, requestId);
            var isValid = apiResponse.getStatus() == RestResponse.Status.OK.getStatusCode();

            log.info("Validacion de OTP para requestId {}. Resultado: {}. Codigo de estado recibido: {}",
                    requestId, isValid, apiResponse.getStatus());

            return isValid;
        } catch(InvalidTokenException ex) {
            return  false;
        } catch(GatewayServiceException ex) {
            log.error(LoggerHelper.buildError(requestId, "Fallo la comunicacion con el servicio de validate otp"));
            throw  ex;
        }  finally {
            log.debug(LoggerHelper.buildInfoPrivateResponse(requestId, "Finalizado caso de uso: Validate OTP"));
        }
    }

}