package com.kexue.skills.common;

import com.kexue.skills.exception.BizException;

import java.util.Collection;
import java.util.Map;

/**
 * 断言工具类，用于封装业务异常的抛出
 * 参考continue-admin的实现方式
 * 
 * @author 王志维
 * @since 2026-01-26
 */
public class Assert {
    
    private Assert() {
        // 私有构造方法，禁止实例化
    }
    
    /**
     * 断言表达式为true，如果为false则抛出BizException
     * 
     * @param expression 表达式
     * @param message 异常信息
     */
    public static void isTrue(boolean expression, String message) {
        if (!expression) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言表达式为true，如果为false则抛出BizException
     * 
     * @param expression 表达式
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void isTrue(boolean expression, long errorCode, String message) {
        if (!expression) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言表达式为false，如果为true则抛出BizException
     * 
     * @param expression 表达式
     * @param message 异常信息
     */
    public static void isFalse(boolean expression, String message) {
        if (expression) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言表达式为false，如果为true则抛出BizException
     * 
     * @param expression 表达式
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void isFalse(boolean expression, long errorCode, String message) {
        if (expression) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言对象不为null，如果为null则抛出BizException
     * 
     * @param object 对象
     * @param message 异常信息
     */
    public static void notNull(Object object, String message) {
        if (object == null) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言对象不为null，如果为null则抛出BizException
     * 
     * @param object 对象
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void notNull(Object object, long errorCode, String message) {
        if (object == null) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言对象为null，如果不为null则抛出BizException
     * 
     * @param object 对象
     * @param message 异常信息
     */
    public static void isNull(Object object, String message) {
        if (object != null) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言对象为null，如果不为null则抛出BizException
     * 
     * @param object 对象
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void isNull(Object object, long errorCode, String message) {
        if (object != null) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言字符串不为空，如果为空则抛出BizException
     * 
     * @param str 字符串
     * @param message 异常信息
     */
    public static void notEmpty(String str, String message) {
        if (str == null || str.isEmpty()) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言字符串不为空，如果为空则抛出BizException
     * 
     * @param str 字符串
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void notEmpty(String str, long errorCode, String message) {
        if (str == null || str.isEmpty()) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言字符串不为空白，如果为空白则抛出BizException
     * 
     * @param str 字符串
     * @param message 异常信息
     */
    public static void notBlank(String str, String message) {
        if (str == null || str.trim().isEmpty()) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言字符串不为空白，如果为空白则抛出BizException
     * 
     * @param str 字符串
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void notBlank(String str, long errorCode, String message) {
        if (str == null || str.trim().isEmpty()) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言集合不为空，如果为空则抛出BizException
     * 
     * @param collection 集合
     * @param message 异常信息
     */
    public static void notEmpty(Collection<?> collection, String message) {
        if (collection == null || collection.isEmpty()) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言集合不为空，如果为空则抛出BizException
     * 
     * @param collection 集合
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void notEmpty(Collection<?> collection, long errorCode, String message) {
        if (collection == null || collection.isEmpty()) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言Map不为空，如果为空则抛出BizException
     * 
     * @param map Map
     * @param message 异常信息
     */
    public static void notEmpty(Map<?, ?> map, String message) {
        if (map == null || map.isEmpty()) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言Map不为空，如果为空则抛出BizException
     * 
     * @param map Map
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void notEmpty(Map<?, ?> map, long errorCode, String message) {
        if (map == null || map.isEmpty()) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言数组不为空，如果为空则抛出BizException
     * 
     * @param array 数组
     * @param message 异常信息
     */
    public static void notEmpty(Object[] array, String message) {
        if (array == null || array.length == 0) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言数组不为空，如果为空则抛出BizException
     * 
     * @param array 数组
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void notEmpty(Object[] array, long errorCode, String message) {
        if (array == null || array.length == 0) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言两个对象相等，如果不相等则抛出BizException
     * 
     * @param obj1 对象1
     * @param obj2 对象2
     * @param message 异常信息
     */
    public static void equals(Object obj1, Object obj2, String message) {
        if (!obj1.equals(obj2)) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言两个对象相等，如果不相等则抛出BizException
     * 
     * @param obj1 对象1
     * @param obj2 对象2
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void equals(Object obj1, Object obj2, long errorCode, String message) {
        if (!obj1.equals(obj2)) {
            throw new BizException(errorCode, message);
        }
    }
    
    /**
     * 断言两个对象不相等，如果相等则抛出BizException
     * 
     * @param obj1 对象1
     * @param obj2 对象2
     * @param message 异常信息
     */
    public static void notEquals(Object obj1, Object obj2, String message) {
        if (obj1.equals(obj2)) {
            throw new BizException(message);
        }
    }
    
    /**
     * 断言两个对象不相等，如果相等则抛出BizException
     * 
     * @param obj1 对象1
     * @param obj2 对象2
     * @param errorCode 错误码
     * @param message 异常信息
     */
    public static void notEquals(Object obj1, Object obj2, long errorCode, String message) {
        if (obj1.equals(obj2)) {
            throw new BizException(errorCode, message);
        }
    }
}