package com.ruoyi.lsfx.util;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 对象转换工具类
 */
@Slf4j
public class ObjectUtil {

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    /**
     * 将对象转换为Map
     * 使用Jackson ObjectMapper进行转换，支持复杂对象和嵌套结构
     *
     * @param obj 要转换的对象
     * @return 转换后的Map，如果转换失败返回空Map
     */
    @SuppressWarnings("unchecked")
    public static Map<String, Object> toMap(Object obj) {
        if (obj == null) {
            return new HashMap<>();
        }

        try {
            // 先将对象转为JSON字符串，再转为Map
            // 这种方式可以处理复杂对象、嵌套对象、集合等
            String json = OBJECT_MAPPER.writeValueAsString(obj);
            return OBJECT_MAPPER.readValue(json, Map.class);
        } catch (Exception e) {
            log.error("对象转Map失败: {}", e.getMessage(), e);
            return new HashMap<>();
        }
    }

    /**
     * 将对象转换为Map（忽略空值）
     *
     * @param obj 要转换的对象
     * @return 转换后的Map（不包含null值），如果转换失败返回空Map
     */
    @SuppressWarnings("unchecked")
    public static Map<String, Object> toMapIgnoreNull(Object obj) {
        if (obj == null) {
            return new HashMap<>();
        }

        try {
            // 配置ObjectMapper在序列化时忽略空值
            ObjectMapper mapper = new ObjectMapper();
            mapper.setSerializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL);

            String json = mapper.writeValueAsString(obj);
            return mapper.readValue(json, Map.class);
        } catch (Exception e) {
            log.error("对象转Map失败: {}", e.getMessage(), e);
            return new HashMap<>();
        }
    }
}
