package com.sjyt.icom.asst.common.util;

import cn.hutool.core.util.ObjectUtil;
import com.sjyt.icom.asst.common.funtional.BranchHandle;
import com.sjyt.icom.asst.common.funtional.FalseBranchHandle;
import com.sjyt.icom.asst.common.funtional.PresentOrElseHandler;
import com.sjyt.icom.asst.common.funtional.TrueBranchHandle;

import java.lang.reflect.Field;
import java.util.List;

/**
 * <p>函数式接口处理工具类</p>
 *
 * @author renyanru
 * @version V1.0.0
 * @date 2022/6/20 9:31
 */
public class FuncUtils {

    /**
     * 参数为true或false时，分别进行不同操作
     *
     * @param b boolean
     * @return com.sjyt.icom.asst.functional.BranchHandle
     */
    public static BranchHandle isTrueOrFalse(boolean b) {
        return (trueHandle, falseHandle) -> {
            if (b) {
                trueHandle.run();
            } else {
                falseHandle.run();
            }
        };
    }

    /**
     * 参数为true时，进行操作
     *
     * @param b boolean
     * @return com.sjyt.icom.asst.functional.BranchHandle
     */
    public static TrueBranchHandle isTrue(boolean b) {
        return (trueHandle) -> {
            if (b) {
                trueHandle.run();
            }
        };
    }

    /**
     * 参数为false时，进行操作
     *
     * @param b boolean
     * @return com.sjyt.icom.asst.functional.BranchHandle
     */
    public static FalseBranchHandle isFalse(boolean b) {
        return (falseHandle) -> {
            if (!b) {
                falseHandle.run();
            }
        };
    }

    /**
     * 值不为空事执行消费操作
     * 值为空时执行其他操作     * @param t
     * @param <T> t
     * @return PresentOrElseHandler
     */
    public static <T>PresentOrElseHandler<T> isBlankOrNoBlank(T t){
        return ((action, emptyAction) -> {
            if (ObjectUtil.isNotEmpty(t)){
                action.accept(t);
            }else {
                emptyAction.run();
            }
        });
    }

    /**
     * 验证对象所有属性不能为空和null
     * @param obj 对象
     * @param exceptFields 排除属性
     * @return r ture 检查不通过， false检查通过
     */
    public static boolean checkObjFieldIsNullAndBlank(Object obj, List<String> exceptFields){
        try {
            for (Field f: obj.getClass().getDeclaredFields()){
                if (null !=exceptFields && exceptFields.contains(f.getName())){
                    continue;
                }
                f.setAccessible(true);
                if (f.get(obj)==null || f.get(obj)==""){
                    return true;
                }
            }
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return false;
    }
}
