package com.mosty.base.utils.spring;

import com.mosty.base.utils.MessageUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;

import java.util.List;

/**
 * spring校验工具
 */
public class SpringValidUtils {

    /**
     * 主键ID长度最大值
     */
    private static final Integer ID_MAX_LENGTH = 32;

    /**
     * 备注长度最大值
     */
    private static final Integer MARK_MAX_LENGTH = 500;

    /**
     * 获取错误信息
     * @param bindingResult spring校验对象
     * @return 错误信息
     */
    public static String getErrorsMsg(BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return SpringValidUtils.getValidationMsg(bindingResult);
        }
        return null;
    }

    /**
     * 获取请求参数错误信息
     * @param bindingResult spring校验对象
     * @return 错误信息
     */
    public static String getValidationMsg(BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            //错误信息
            StringBuilder esbd = new StringBuilder();
            List<ObjectError> list = bindingResult.getAllErrors();
            for(ObjectError objectError : list){
                esbd.append(objectError.getDefaultMessage());
                esbd.append("，");
            }
            if(esbd.length() > 0){
                esbd.deleteCharAt(esbd.length() - 1 );
                return esbd.toString();
            }
        }
        return null;
    }

    /**
     * 校验注销信息
     * @param id 主键ID
     * @param xtZxyy 注销原因
     * @return 错误信息
     */
    public static String getCancelMsg(String id, String xtZxyy){
        //错误信息
        StringBuilder esbd = new StringBuilder();

        if(StringUtils.isBlank(id)){
            esbd.append(MessageUtils.message("id.bnwk"));
            esbd.append("，");
        }else if(id.length() > ID_MAX_LENGTH){
            esbd.append(MessageUtils.message("id.size"));
            esbd.append("，");
        }
        if(StringUtils.isBlank(xtZxyy)){
            esbd.append(MessageUtils.message("xt.zxyy.bnwk"));
            esbd.append("，");
        }else if(xtZxyy.length() > MARK_MAX_LENGTH){
            esbd.append(MessageUtils.message("xt.zxyy.size"));
            esbd.append("，");
        }

        if(esbd.length() > 0) {
            esbd.deleteCharAt(esbd.length() - 1);
            return esbd.toString();
        }
        return null;
    }

    /**
     * 注解长度校验
     * @param isNotBlank 是否不能为空
     * @param max 最大值
     * @param min 最小值
     * @param value 需要校验的字符串
     * @return 是否校验通过
     */
    public static boolean annotationSizeValidation(boolean isNotBlank, int max, int min, String value){

        //校验是否为空
        if(StringUtils.isBlank(value)){
            //如果需要校验的值为空，并且该项为必填项，则返回错误
            if(isNotBlank){
                return false;
            }
        }

        //校验是否大于最大值
        if(!StringUtils.isBlank(value) && max != Integer.MAX_VALUE) {
            if(value.length() > max){
                return false;
            }
        }

        //校验是否小于最小值
        if(!StringUtils.isBlank(value) && min != Integer.MIN_VALUE){
            return value.length() > min;
        }

        return true;
    }

}
