package com.goldenwater.common.utils;

import java.util.*;

/**
 * 字段名转换工具类
 */
public class FieldConvertUtils {

    /**
     * 将Map中的大写下划线字段转换为小写驼峰格式
     * @param data 原始数据列表
     * @return 转换后的数据列表
     */
    public static List<Map<String, Object>> convertToCamelCase(List<Map<String, Object>> data) {
        if (data == null || data.isEmpty()) {
            return data;
        }
        
        List<Map<String, Object>> result = new ArrayList<>();
        for (Map<String, Object> item : data) {
            result.add(convertMapKeysToCamelCase(item));
        }
        return result;
    }

    /**
     * 将单个Map中的键从大写下划线格式转换为小写驼峰格式
     * @param map 原始Map
     * @return 转换后的Map
     */
    private static Map<String, Object> convertMapKeysToCamelCase(Map<String, Object> map) {
        if (map == null || map.isEmpty()) {
            return map;
        }
        
        Map<String, Object> converted = new LinkedHashMap<>();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            
            // 将大写下划线格式转换为小写驼峰格式
            String camelKey = toCamelCase(key);
            converted.put(camelKey, value);
        }
        return converted;
    }

    /**
     * 将下划线命名转换为驼峰命名
     * @param str 下划线命名的字符串
     * @return 驼峰命名的字符串
     */
    private static String toCamelCase(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        
        // 如果已经是小写开头，直接返回
        if (Character.isLowerCase(str.charAt(0))) {
            return str;
        }
        
        // 转为小写
        str = str.toLowerCase();
        
        StringBuilder sb = new StringBuilder(str.length());
        boolean upperCase = false;
        
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            
            if (c == '_') {
                upperCase = true;
            } else if (upperCase) {
                sb.append(Character.toUpperCase(c));
                upperCase = false;
            } else {
                sb.append(c);
            }
        }
        
        return sb.toString();
    }
}