package com.hzya.frame.seeyon.util;

import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ClassName YzfObjectUtil
 * @Description
 * @Author llg
 * Date 2025/4/2 2:12 下午
 */
public class YzfObjectUtil {
    /**
     * 是否为包装类型
     *
     * @param clazz 类
     * @return 是否为包装类型
     */
    public static boolean isPrimitiveWrapper(Class<?> clazz) {
        if (null == clazz) {
            return false;
        }
        return BasicType.wrapperPrimitiveMap.containsKey(clazz);
    }

    /**
     * 是否为基本类型（包括包装类和原始类）
     *
     * @param clazz 类
     * @return 是否为基本类型
     */
    public static boolean isBasicType(Class<?> clazz) {
        if (null == clazz) {
            return false;
        }
        return (clazz.isPrimitive() || isPrimitiveWrapper(clazz));
    }


    /**
     * @param clazz 类
     * @return 是否为简单值类型
     * 判断是否是基本数据类型、String类型、other CharSequence、Number、Date
     */
    public static boolean isSimpleTypeOrString(Class<?> clazz) {
        if(clazz == null) {
            return false;
        }
        return isBasicType(clazz) || clazz.isEnum() || CharSequence.class.isAssignableFrom(clazz)
                || Number.class.isAssignableFrom(clazz) || Date.class.isAssignableFrom(clazz);
    }

    enum BasicType {
        BYTE, SHORT, INT, INTEGER, LONG, DOUBLE, FLOAT, BOOLEAN, CHAR, CHARACTER, STRING;

        /**
         * 包装类型为Key，原始类型为Value，例如： Integer.class =》 int.class.
         */
        public static final Map<Class<?>, Class<?>> wrapperPrimitiveMap = new ConcurrentHashMap<>(8);
        /**
         * 原始类型为Key，包装类型为Value，例如： int.class =》 Integer.class.
         */
        public static final Map<Class<?>, Class<?>> primitiveWrapperMap = new ConcurrentHashMap<>(8);

        static {
            wrapperPrimitiveMap.put(Boolean.class, boolean.class);
            wrapperPrimitiveMap.put(Byte.class, byte.class);
            wrapperPrimitiveMap.put(Character.class, char.class);
            wrapperPrimitiveMap.put(Double.class, double.class);
            wrapperPrimitiveMap.put(Float.class, float.class);
            wrapperPrimitiveMap.put(Integer.class, int.class);
            wrapperPrimitiveMap.put(Long.class, long.class);
            wrapperPrimitiveMap.put(Short.class, short.class);

            for (Map.Entry<Class<?>, Class<?>> entry : wrapperPrimitiveMap.entrySet()) {
                primitiveWrapperMap.put(entry.getValue(), entry.getKey());
            }
        }
    }
}
