package com.czg.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;

import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 校验工具类
 *
 * @author admin admin@cashier.com
 * @since 1.0.0
 */
public class AssertUtil {

    /**
     * 判断两个对象是否不相等，如果不相等则抛出异常
     * 注意字段类型
     *
     * @param a       实际值
     * @param b       期望值
     * @param message 异常消息
     */
    public static void isNotEqual(Object a, Object b, String message) {
        // 检查是否有任何一个为null
        if (a == null || b == null) {
            throw new ValidateException("参数不能为null: " + message);
        }
        // 如果实际值与期望值不相等，则抛出异常
        if (!Objects.equals(a, b)) {
            throw new ValidateException(message);
        }
    }

    /**
     * 检查字符串是否不为空或空白字符，如果为空或空白字符则抛出异常
     *
     * @param str 要检查的字符串
     * @param msg 异常信息
     * @throws ValidateException 如果字符串为空或空白字符
     */
    public static void isBlank(String str, String msg) {
        if (StrUtil.isBlank(str)) {
            throw new ValidateException(msg);
        }
    }

    /**
     * 检查字符串是否不为空或空白字符，如果为空或空白字符则抛出异常
     *
     * @param str              要检查的字符串
     * @param errorMsgTemplate 异常信息模板
     * @param params           异常信息模板的参数
     * @throws ValidateException 如果字符串为空或空白字符
     */
    public static void isBlank(String str, String errorMsgTemplate, Object... params) {
        isBlank(str, StrUtil.format(errorMsgTemplate, params));
    }

    /**
     * 检查对象是否不为 null，如果为 null 则抛出异常
     *
     * @param object 要检查的对象
     * @param msg    异常信息
     * @throws ValidateException 如果对象为 null
     */
    public static void isNull(Object object, String msg) {
        if (object == null) {
            throw new ValidateException(msg);
        }
    }

    /**
     * 检查对象是否不为 null，如果为 null 则抛出异常
     *
     * @param object           要检查的对象
     * @param errorMsgTemplate 异常信息模板
     * @param params           异常信息模板的参数
     * @throws ValidateException 如果对象为 null
     */
    public static void isNull(Object object, String errorMsgTemplate, Object... params) {
        isNull(object, StrUtil.format(errorMsgTemplate, params));
    }

    public static void isTrue(boolean flag, String errorMsgTemplate, Object... params) {
        if (flag) {
            throw new ValidateException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    /**
     * 检查数组是否不为空，如果为空则抛出异常
     *
     * @param array 要检查的数组
     * @param msg   异常信息
     * @throws ValidateException 如果数组为空
     */
    public static void isArrayEmpty(Object[] array, String msg) {
        if (ArrayUtil.isEmpty(array)) {
            throw new ValidateException(msg);
        }
    }

    /**
     * 检查数组是否不为空，如果为空则抛出异常
     *
     * @param array            要检查的数组
     * @param errorMsgTemplate 异常信息模板
     * @param params           异常信息模板的参数
     * @throws ValidateException 如果数组为空
     */
    public static void isArrayEmpty(Object[] array, String errorMsgTemplate, Object... params) {
        isArrayEmpty(array, StrUtil.format(errorMsgTemplate, params));
    }

    /**
     * 检查列表是否不为空，如果为空则抛出异常
     *
     * @param list 要检查的列表
     * @param msg  异常信息
     * @throws ValidateException 如果列表为空
     */
    public static void isListEmpty(List<?> list, String msg) {
        if (CollUtil.isEmpty(list)) {
            throw new ValidateException(msg);
        }
    }

    /**
     * 检查列表是否不为空，如果为空则抛出异常
     *
     * @param list             要检查的列表
     * @param errorMsgTemplate 异常信息模板
     * @param params           异常信息模板的参数
     * @throws ValidateException 如果列表为空
     */
    public static void isListEmpty(List<?> list, String errorMsgTemplate, Object... params) {
        isListEmpty(list, StrUtil.format(errorMsgTemplate, params));
    }

    /**
     * 检查 Map 是否不为空，如果为空则抛出异常
     *
     * @param <K> Map 的键类型
     * @param <V> Map 的值类型
     * @param map 要检查的 Map
     * @param msg 异常信息
     * @throws ValidateException 如果 Map 为空
     */
    public static <K, V> void isMapEmpty(Map<K, V> map, String msg) {
        if (MapUtil.isEmpty(map)) {
            throw new ValidateException(msg);
        }
    }

    /**
     * 检查 Map 是否不为空，如果为空则抛出异常
     *
     * @param <K>              Map 的键类型
     * @param <V>              Map 的值类型
     * @param map              要检查的 Map
     * @param errorMsgTemplate 异常信息模板
     * @param params           异常信息模板的参数
     * @throws ValidateException 如果 Map 为空
     */
    public static <K, V> void isMapEmpty(Map<K, V> map, String errorMsgTemplate, Object... params) {
        isMapEmpty(map, StrUtil.format(errorMsgTemplate, params));
    }


}
