package com.backendsys.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.stream.Collectors;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

@SuppressWarnings({"rawtypes", "unchecked"})
public class ListUtil {

    /**
     * 将列表中的Map对象转换为一个新的Map，其中可以使用自定义的键和值关键字。
     */
    public static <K, V> Map<K, V> convertListToMap(List<Map<String, Object>> list, String keyKeyword, String valueKeyword) {
        return (Map<K, V>) list.stream()
            .collect(Collectors.toMap(
                map -> Optional.ofNullable(map.get(keyKeyword)).orElse("noFound"),
                map -> Optional.ofNullable(map.get(valueKeyword)).orElse(null)
            ));
    }

    /**
     * 将大驼峰命名转换为下划线命名 (列表记录)
     */
    public static List<Map<String, Object>> convertToUnderscoreCase(List<Map<String, Object>> list) {
        // 遍历 virtualmans 列表，并将 key 由大驼峰改为下划线命名
        for (Map<String, Object> map : list) {
            Map<String, Object> newMap = new HashMap<>();
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String newKey = MapUtil.convertKeyToUnderscoreCase(entry.getKey());    // 将大驼峰命名转换为下划线命名
                newMap.put(newKey, entry.getValue());
            }
            // 替换原始 Map 中的 key
            map.clear();
            map.putAll(newMap);
        }
        return list;
    }


    /**
     * 将List中的Map对象的指定字段值从Array转换为String类型，并判断字段是否存在且非空
     *
     * 示例：遍历列表，将每行记录的 emotional_categories 从 Array 转为 String
     * ListUtil.convertToString(filteredTimbreAssets, "emotional_categories");
     *
     * @param list          List<Map<String, Object>> 类型的数据列表
     * @param fieldName     需要转换的字段名称
     * @return              转换后的List<Map<String, Object>>
     */
    public static List<Map<String, Object>> convertToString(List<Map<String, Object>> list, String fieldName) {
        if (CollUtil.isNotEmpty(list)) {
            list = list.stream().map(map -> {
                // 判断字段是否存在
                if (map.containsKey(fieldName)) {
                    // 获得字段值 (带中括号的)
                    String fieldVal = (String) map.get(fieldName);
                    // 去除中括号 (小心java的substring是左闭右开的)
                    fieldVal = fieldVal.substring(1, fieldVal.toString().length() - 1);
                    // 去除所有的空字符
                    fieldVal = fieldVal.replaceAll("\\s", "");
                    map.put(fieldName, fieldVal);
                }
                return map;
            }).collect(Collectors.toList());
        }
        return list;
    }



    /**
     * 将列表中每个map中指定键的值从表示数组的字符串转换为实际的整数数组。
     * ListUtil.convertToArray(list, "resolution");
     *
     * @param list 列表
     * @param key 需要转换值的键
     */
    public static List<Map<String, Object>> convertToArray(List<Map<String, Object>> list, String key) {
        if (CollUtil.isNotEmpty(list)) {
            for (Map<String, Object> map : list) {
                if (map.containsKey(key)) {
                    Object value = map.get(key);
                    if (value instanceof String) {
                        if (!value.toString().isEmpty()) {
                            String[] parts = value.toString().substring(1, value.toString().length() - 1).split(",");
                            int[] arrValue = new int[parts.length];
                            for (int i = 0; i < parts.length; i++) {
                                arrValue[i] = Integer.parseInt(parts[i]);
                            }
                            map.put(key, arrValue);
                        }
                    }
                }
            }
        }
        return list;
    }



    /**
     * 将列表中的 JSON 字符串转换为 JSON 对象，并替换原来的字符串值
     * ListUtil.convertToJsonObjects(list, "source");
     *
     * @param list 列表
     * @param key  需要转换值的键
     */
    public static void convertToJsonObjects(List<Map<String, Object>> list, String key) {
        if (CollUtil.isNotEmpty(list)) {
            // 创建ObjectMapper对象
            ObjectMapper mapper = new ObjectMapper();
            // 遍历列表中的每个map
            for (Map<String, Object> map : list) {
                // 检查map是否包含指定的键
                if (map.containsKey(key)) {
                    Object value = map.get(key);
                    // 检查值是否为字符串
                    if (value instanceof String) {
                        String jsonString = (String) value;
                        try {
                            // 将JSON字符串转换为JSON对象并替换原来的字符串值
                            ObjectNode jsonObject = (ObjectNode) mapper.readTree(jsonString);
                            map.put(key, jsonObject);
                        } catch (Exception e) {
                            // 异常处理，输出错误信息
                            System.err.println("转换JSON字符串失败：" + e.getMessage());
                        }
                    }
                }
            }
        }
    }

}
