package com.qqchen.deploy.backend.framework.utils;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.util.Map;

/**
 * Map 工具类
 * <p>提供从 Map 中安全获取和转换各种类型值的工具方法
 *
 * @author qqchen
 * @since 2025-11-06
 */
@Slf4j
public class MapUtils {

    private MapUtils() {
        throw new UnsupportedOperationException("Utility class cannot be instantiated");
    }

    /**
     * 从 Map 中安全获取 Long 值
     * <p>支持类型转换：Long、Integer、String
     * 
     * @param map 数据 Map
     * @param key 键名
     * @return Long 值，转换失败或不存在返回 null
     */
    public static Long getLongValue(Map<String, Object> map, String key) {
        if (map == null || key == null) {
            return null;
        }
        
        Object value = map.get(key);
        if (value == null) {
            return null;
        }
        
        if (value instanceof Long) {
            return (Long) value;
        }
        if (value instanceof Integer) {
            return ((Integer) value).longValue();
        }
        if (value instanceof String) {
            try {
                return Long.parseLong((String) value);
            } catch (NumberFormatException e) {
                log.warn("无法将 key={} 的值转换为 Long: {}", key, value);
                return null;
            }
        }
        if (value instanceof Number) {
            return ((Number) value).longValue();
        }
        
        log.warn("不支持的 Long 类型转换，key={}, type={}", key, value.getClass().getName());
        return null;
    }

    /**
     * 从 Map 中安全获取 Integer 值
     * <p>支持类型转换：Integer、Long、String
     * 
     * @param map 数据 Map
     * @param key 键名
     * @return Integer 值，转换失败或不存在返回 null
     */
    public static Integer getIntegerValue(Map<String, Object> map, String key) {
        if (map == null || key == null) {
            return null;
        }
        
        Object value = map.get(key);
        if (value == null) {
            return null;
        }
        
        if (value instanceof Integer) {
            return (Integer) value;
        }
        if (value instanceof Long) {
            return ((Long) value).intValue();
        }
        if (value instanceof String) {
            try {
                return Integer.parseInt((String) value);
            } catch (NumberFormatException e) {
                log.warn("无法将 key={} 的值转换为 Integer: {}", key, value);
                return null;
            }
        }
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        
        log.warn("不支持的 Integer 类型转换，key={}, type={}", key, value.getClass().getName());
        return null;
    }

    /**
     * 从 Map 中安全获取 String 值
     * 
     * @param map 数据 Map
     * @param key 键名
     * @return String 值，不存在返回 null
     */
    public static String getStringValue(Map<String, Object> map, String key) {
        if (map == null || key == null) {
            return null;
        }
        
        Object value = map.get(key);
        return value != null ? value.toString() : null;
    }

    /**
     * 从 Map 中安全获取 Boolean 值
     * <p>支持类型转换：Boolean、String("true"/"false")
     * 
     * @param map 数据 Map
     * @param key 键名
     * @return Boolean 值，转换失败或不存在返回 null
     */
    public static Boolean getBooleanValue(Map<String, Object> map, String key) {
        if (map == null || key == null) {
            return null;
        }
        
        Object value = map.get(key);
        if (value == null) {
            return null;
        }
        
        if (value instanceof Boolean) {
            return (Boolean) value;
        }
        if (value instanceof String) {
            return Boolean.parseBoolean((String) value);
        }
        
        log.warn("不支持的 Boolean 类型转换，key={}, type={}", key, value.getClass().getName());
        return null;
    }

    /**
     * 从 Map 中安全获取 Double 值
     * <p>支持类型转换：Double、Float、Integer、Long、String、BigDecimal
     * 
     * @param map 数据 Map
     * @param key 键名
     * @return Double 值，转换失败或不存在返回 null
     */
    public static Double getDoubleValue(Map<String, Object> map, String key) {
        if (map == null || key == null) {
            return null;
        }
        
        Object value = map.get(key);
        if (value == null) {
            return null;
        }
        
        if (value instanceof Double) {
            return (Double) value;
        }
        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }
        if (value instanceof String) {
            try {
                return Double.parseDouble((String) value);
            } catch (NumberFormatException e) {
                log.warn("无法将 key={} 的值转换为 Double: {}", key, value);
                return null;
            }
        }
        
        log.warn("不支持的 Double 类型转换，key={}, type={}", key, value.getClass().getName());
        return null;
    }

    /**
     * 从 Map 中安全获取 Long 值（带默认值）
     * 
     * @param map 数据 Map
     * @param key 键名
     * @param defaultValue 默认值
     * @return Long 值，转换失败或不存在返回默认值
     */
    public static Long getLongValue(Map<String, Object> map, String key, Long defaultValue) {
        Long value = getLongValue(map, key);
        return value != null ? value : defaultValue;
    }

    /**
     * 从 Map 中安全获取 Integer 值（带默认值）
     * 
     * @param map 数据 Map
     * @param key 键名
     * @param defaultValue 默认值
     * @return Integer 值，转换失败或不存在返回默认值
     */
    public static Integer getIntegerValue(Map<String, Object> map, String key, Integer defaultValue) {
        Integer value = getIntegerValue(map, key);
        return value != null ? value : defaultValue;
    }

    /**
     * 从 Map 中安全获取 String 值（带默认值）
     * 
     * @param map 数据 Map
     * @param key 键名
     * @param defaultValue 默认值
     * @return String 值，不存在返回默认值
     */
    public static String getStringValue(Map<String, Object> map, String key, String defaultValue) {
        String value = getStringValue(map, key);
        return value != null ? value : defaultValue;
    }

    /**
     * 从 Map 中安全获取 Boolean 值（带默认值）
     * 
     * @param map 数据 Map
     * @param key 键名
     * @param defaultValue 默认值
     * @return Boolean 值，转换失败或不存在返回默认值
     */
    public static Boolean getBooleanValue(Map<String, Object> map, String key, Boolean defaultValue) {
        Boolean value = getBooleanValue(map, key);
        return value != null ? value : defaultValue;
    }
}

