package top.baogutang.common.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @description: JacksonUtil
 * @author: nikooh
 * @date: 2024/08/06 : 10:50
 */
@Slf4j
public class JacksonUtil {

    private JacksonUtil() {
        // empty private constructor
    }

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    public static ObjectMapper OBJECT_MAPPER = new ObjectMapper();


    static {
        // 所有的日期都统一用yyyy-MM-dd HH:mm:ss格式
        OBJECT_MAPPER.setDateFormat(new SimpleDateFormat(DEFAULT_DATE_FORMAT));
        // 忽略字符串存在，对象不存在的属性
        OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    /**
     * 对象转json字符串
     *
     * @param content 需要转换的对象
     * @return json格式字符串
     */
    public static String toJson(Object content) {
        String result = StringUtils.EMPTY;
        if (Objects.isNull(content)) {
            return result;
        }
        try {
            result = OBJECT_MAPPER.writeValueAsString(content);
        } catch (Exception e) {
            log.error(">>>>>>>>>>parse object to json fail:{}<<<<<<<<<<", e.getMessage());
        }
        return result;
    }

    /**
     * 字符串转自定义对象
     *
     * @param content 需要转换的字符串
     * @param clazz   需要转换后的类型
     * @param <T>     泛型
     * @return 转换后对象
     */
    public static <T> T fromJson(String content, Class<T> clazz) {
        T result = null;
        if (StringUtils.isBlank(content)) {
            return result;
        }
        try {
            result = OBJECT_MAPPER.readValue(content, clazz);
        } catch (Exception e) {
            log.error(">>>>>>>>>>parse json to object fail:{}<<<<<<<<<<", e.getMessage());
        }
        return result;
    }

    /**
     * 字符串转自定义对象
     *
     * @param content 需要转换的字符串
     * @param type    需要转换后的类型
     * @param <T>     泛型
     * @return 转换后对象
     */
    public static <T> T fromJson(String content, TypeReference<T> type) {
        T result = null;
        if (StringUtils.isBlank(content)) {
            return result;
        }
        try {
            result = OBJECT_MAPPER.readValue(content, type);
        } catch (Exception e) {
            log.error(">>>>>>>>>>parse json to object fail:{}<<<<<<<<<<", e.getMessage());
        }
        return result;
    }

    /**
     * json字符串转换为List
     *
     * @param content 需要转换的字符串
     * @param clazz   需要转换后的类型
     * @param <T>     泛型
     * @return 转换后的集合
     */
    public static <T> List<T> jsonToList(String content, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        if (StringUtils.isBlank(content) || clazz == null) {
            return list;
        }
        try {
            list = OBJECT_MAPPER.readValue(content, new TypeReference<List<T>>() {
            });
        } catch (Exception e) {
            log.error(">>>>>>>>>>parse json to list fail:{}<<<<<<<<<<", e.getMessage());
        }
        return list;
    }

    /**
     * json字符串转换为Map
     *
     * @param content   需要转换的字符串
     * @param keyType   需要转换后的key类型
     * @param valueType 需要转换后的value类型
     * @param <K>       Class<K>
     * @param <V>       Class<V>
     * @return 转换后的Map
     */
    public static <K, V> Map<K, V> jsonToMap(String content, Class<K> keyType, Class<V> valueType) {
        Map<K, V> result = new HashMap<>();
        if (StringUtils.isBlank(content) || Objects.isNull(keyType) || Objects.isNull(valueType)) {
            return result;
        }
        try {
            result = OBJECT_MAPPER.readValue(content, new TypeReference<Map<K, V>>() {
            });
        } catch (Exception e) {
            log.error(">>>>>>>>>>parse json to map fail:{}<<<<<<<<<<", e.getMessage());
        }
        return result;
    }

    /**
     * json字符串转换为JsonNode
     *
     * @param content 需要转换的字符串
     * @return 转换后的JsonNode
     */
    public static JsonNode jsonToNode(String content) {
        JsonNode jsonNode = null;
        if (StringUtils.isBlank(content)) {
            return null;
        }
        try {
            jsonNode = OBJECT_MAPPER.readTree(content);
        } catch (Exception e) {
            log.error(">>>>>>>>>>parse json to node fail:{}<<<<<<<<<<", e.getMessage());
        }
        return jsonNode;
    }
}
