package cn.timer.api.config.exception;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import cn.hutool.core.util.StrUtil;
import cn.timer.api.aspect.lang.bean.ValidationError;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;

/**
 * 全局异常处理器
 * 
 * @author Tang
 */
@RestControllerAdvice // @ControllerAdvice + @ResponseBody 组合注解
public class GlobalExceptionHandler {

	private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

	@ExceptionHandler(Exception.class)
	public Result<Object> handleException(Exception e) {
		log.error(e.getMessage(), e);
		return ResultUtil.error(e.getMessage());
	}

	/**
	 * 空指针异常
	 * @param e
	 * @return
	 */
	@ExceptionHandler(NullPointerException.class)
	public Result<Object> nullPointerException(NullPointerException e) {
		log.error(e.getMessage(), e);
		return ResultUtil.error(e.getMessage());
	}

	/**
	 * 类型强制转换异常
	 * @param e
	 * @return
	 */
	@ExceptionHandler(ClassCastException.class)
	public Result<Object> classCastException(ClassCastException e) {
		log.error(e.getMessage(), e);
		return ResultUtil.error(e.getMessage());
	}

	/**
	 * 业务异常
	 */
	@ExceptionHandler(CustomException.class)
	public Result<Object> businessException(CustomException e) {
		if (StrUtil.isBlank(e.getCode())) {
			return ResultUtil.error(e.getMessage());
		}
		return ResultUtil.error(e.getCode(), e.getMessage());
	}
	
	/**
	 * io异常
	 */
	@ExceptionHandler(IOException.class)
	public Result<Object> ioException(IOException e) {
		log.error(e.getMessage(), e);
		return ResultUtil.error(e.getMessage());
	}
	
    /**
     * 自定义验证异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object validExceptionHandler(MethodArgumentNotValidException e)
    {
//        log.error("1--------"+e.getMessage());
//        log.error("2--------"+JSONUtil.parse(e.getBindingResult().getAllErrors()));
//        String message = e.getBindingResult().getFieldError().getDefaultMessage();
//        String field = e.getBindingResult().getFieldError().getField();
        List<ObjectError> ls = e.getBindingResult().getAllErrors();
        List<ValidationError> listVe = new ArrayList<ValidationError>();
        ValidationError ve;
        for (ObjectError one : ls) {
        	
        	String fieldString = one.getCodes().length >= 1 ? one.getCodes()[0] : "";
        	if (fieldString != null) {
        		fieldString = fieldString.substring(fieldString.lastIndexOf(".") + 1);
			}
        	
        	ve = ValidationError.builder().field(fieldString).msg(one.getDefaultMessage()).build();
        	listVe.add(ve);
        	
        }
        return ResultUtil.error(listVe);
    }
}