package com.sjyt.icom.asst.conf.decode;

import com.github.lianjiatech.retrofit.spring.boot.core.ErrorDecoder;
import com.sjyt.icom.asst.common.enums.ErrorCodeEnum;
import com.sjyt.icom.asst.common.exception.SrsErrorStatusException;
import com.sjyt.icom.asst.common.util.FuncUtils;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * <p>错误解码器</p>
 * 当请求异常或收到无效响应结果的时候，将http相关信息解码到异常中，无效响应有业务自行判断
 * @author renyanru
 * @version V1.0.0
 * @date 2022/6/21 17:23
 */
@Slf4j
@Component
public class HttpErrorDecoder implements ErrorDecoder {

    /**
     * 当请求发送除IO异常之外的其他异常时，将http信息解码到异常中
     * @param request
     * @param cause
     * @return
     */
    @Override
    public RuntimeException exceptionDecode(Request request, Exception cause) {
        log.error("rpc：异常");
        return ErrorDecoder.super.exceptionDecode(request, cause);
    }

    /**
     * 当请求异常或收到无效响应结果的时候，将http相关信息解码到异常中，无效响应有业务自行判断
     * @param request request
     * @param response response
     * @return 如果返回为null,则忽略处理，并继续处理原始响应
     */
    @Override
    public RuntimeException invalidRespDecode(Request request, Response response) {
        FuncUtils.isTrue(!response.isSuccessful()).trueHandle(()->{
            log.error("rpc：远程无响应");
            throw new SrsErrorStatusException(ErrorCodeEnum.UNKNOWN_ERROR.getCode());
        });
        return null;
    }

    /**
     * 当请求发送IO异常时，将http信息解码到异常中
     * @param request request
     * @param cause cause
     * @return RuntimeException
     */
    @Override
    public RuntimeException ioExceptionDecode(Request request, IOException cause) {
        log.error("rpc：i/o异常");
        return ErrorDecoder.super.ioExceptionDecode(request, cause);
    }
}
