package com.common.util;


import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 分隔符文本解析工具类
 */
@Component
public class TextParserUtil {

    /**
     * 解析分隔符类型的文本数据
     * @param text 原始文本
     * @param sepKey 分隔符（字符或字符串）
     * @return LinkedHashMap对象，key为序号字符串，value为实际值
     */
    public static LinkedHashMap<String, Object> parseSeparatedText(String text, String sepKey) {
        LinkedHashMap<String, Object> resultMap = new LinkedHashMap<>();

        if (text == null || text.trim().isEmpty()) {
            return resultMap;
        }

        if (sepKey == null || sepKey.isEmpty()) {
            // 如果分隔符为空，将整个文本作为第一个元素
            resultMap.put("1", text.trim());
            return resultMap;
        }

        // 使用分隔符分割文本
        String[] parts = text.split(sepKey, -1); // 使用-1保留空字符串

        // 将分割后的部分放入LinkedHashMap，键为字符串形式的序号
        for (int i = 0; i < parts.length; i++) {
            resultMap.put(String.valueOf(i + 1), parts[i].trim());
        }

        return resultMap;
    }

    /**
     * 解析分隔符文本并过滤空值
     * @param text 原始文本
     * @param sepKey 分隔符
     * @param removeEmpty 是否移除空值
     * @return LinkedHashMap对象
     */
    public static LinkedHashMap<String, Object> parseSeparatedText(String text, String sepKey, boolean removeEmpty) {
        LinkedHashMap<String, Object> resultMap = parseSeparatedText(text, sepKey);

        if (removeEmpty) {
            resultMap.entrySet().removeIf(entry ->
                    entry.getValue() == null ||
                            entry.getValue().toString().isEmpty());
        }

        return resultMap;
    }

    /**
     * 解析分隔符文本并转换为特定类型
     * @param text 原始文本
     * @param sepKey 分隔符
     * @param valueType 值类型（STRING, INTEGER, LONG, DOUBLE, BOOLEAN）
     * @return LinkedHashMap对象
     */
    public static LinkedHashMap<String, Object> parseSeparatedTextWithType(
            String text, String sepKey, ValueType valueType) {
        LinkedHashMap<String, Object> resultMap = parseSeparatedText(text, sepKey);

        if (valueType != ValueType.STRING) {
            resultMap.replaceAll((key, value) -> convertValue(value.toString(), valueType));
        }

        return resultMap;
    }

    /**
     * 值类型枚举
     */
    public enum ValueType {
        STRING, INTEGER, LONG, DOUBLE, BOOLEAN
    }

    /**
     * 值类型转换
     */
    private static Object convertValue(String value, ValueType valueType) {
        if (value == null || value.isEmpty()) {
            return null;
        }

        try {
            switch (valueType) {
                case INTEGER:
                    return Integer.parseInt(value);
                case LONG:
                    return Long.parseLong(value);
                case DOUBLE:
                    return Double.parseDouble(value);
                case BOOLEAN:
                    return Boolean.parseBoolean(value) || "1".equals(value);
                case STRING:
                default:
                    return value;
            }
        } catch (NumberFormatException e) {
            // 转换失败时返回原始字符串
            return value;
        }
    }
}