package com.om.handler;


import com.om.exception.BadReqException;
import com.om.exception.BizException;
import com.om.exception.CustomerAuthenticationException;
import com.om.utils.CommonUtil;
import com.om.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 统一异常处理
 *
 * ControllerAdvice注解的含义是当异常抛到controller层时会拦截下来
 */
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 使用ExceptionHandler注解声明处理Exception异常
     *
     * @param e e
     *
     */
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Result exception(Exception e) {
        // 记录异常信息到日志
        log.error("错误信息: ", e);
        // 返回错误格式信息
        return Result.error();
    }


    @ResponseBody
    @Order(Ordered.HIGHEST_PRECEDENCE)
    @ExceptionHandler(BizException.class)
    public Result BizException(BizException e) {
        // 记录异常信息到日志
        log.error("业务异常信息 ： ", e);
        e.printStackTrace();
        // 返回错误格式信息
        return Result.error().message(e.getMessage()).result(e.getCode());
    }

    @ResponseBody
    @Order(Ordered.HIGHEST_PRECEDENCE)
    @ExceptionHandler(BadReqException.class)
    public Result BadReqException(BadReqException e) {
        // 记录异常信息到日志
        log.error("请求错误信息 : ", e);
        e.printStackTrace();
        // 返回错误格式信息
        return Result.error().message(e.getMessage()).result(e.getCode());
    }

    @ResponseBody
    @Order(Ordered.HIGHEST_PRECEDENCE)
    @ExceptionHandler(CustomerAuthenticationException.class)
    public Result CustomerAuthenticationException(CustomerAuthenticationException e) {
        // 记录异常信息到日志
        log.error("Exception caught: ", e);
        // 返回错误格式信息
        return Result.error().message(e.getMessage());
    }




}
