package cn.reghao.oss.store.exception;

import cn.reghao.jutil.jdk.exception.ExceptionUtil;
import cn.reghao.jutil.jdk.result.WebResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.stream.Collectors;

/**
 * 全局异常处理类，处理 controller 抛出的异常
 *
 * @author reghao
 * @date 2019/03/21 10:25:49
 */
@Slf4j
@ControllerAdvice
public class ControllerExceptionHandler {
    /**
     * 处理所有 controller 上抛出的异常
     *
     * @date 2019-09-28 上午11:01
     */
    @ExceptionHandler({Exception.class})
    @ResponseBody
    public ResponseEntity<String> error(Exception e, HttpServletRequest request) {
        String uri = request.getRequestURI();
        String msg;
        if (e instanceof NullPointerException) {
            msg = ExceptionUtil.stackTrace(e);
        } else {
            msg = ExceptionUtil.errorMsg(e);
        }
        log.error("{} 接口抛出异常: {}", uri, msg);

        String body = WebResult.errorWithMsg(msg);
        int status = HttpStatus.INTERNAL_SERVER_ERROR.value();
        int status1 = HttpStatus.INSUFFICIENT_STORAGE.value();
        if (e instanceof MethodArgumentNotValidException) {
            // 参数校验失败
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
            String errMsg = exception.getBindingResult().getAllErrors().stream()
                    .map(objectError -> {
                        String message = objectError.getDefaultMessage();
                        return message + "\n";
                    }).collect(Collectors.joining());
            body = WebResult.errorWithMsg(errMsg);
        } else if (e instanceof IllegalStateException) {
            IllegalStateException exception = (IllegalStateException) e;
            Throwable throwable = exception.getCause();
            body = WebResult.errorWithMsg(throwable.getMessage());
        }

        return ResponseEntity.status(status).body(body);
    }
}
