package com.common.util;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class KeyValueParser {

    /**
     * 解析键值对字符串
     * @param input 输入字符串
     * @return 解析后的键值对Map
     */
    public static Map<String, String> parseKeyValueString(String input) {
        Map<String, String> result = new HashMap<>();

        // 移除首尾的方括号（如果存在）
        String cleanedInput = input.trim();
        if (cleanedInput.startsWith("[") && cleanedInput.endsWith("]")) {
            cleanedInput = cleanedInput.substring(1, cleanedInput.length() - 1);
        }

        // 使用正则表达式匹配键值对
        // 匹配模式：键=值，值可以包含任意字符（包括空格和标点）
        Pattern pattern = Pattern.compile("(\\w+)=([^=]+?)(?=\\s+\\w+=|$)");
        Matcher matcher = pattern.matcher(cleanedInput);

        while (matcher.find()) {
            String key = matcher.group(1);
            String value = matcher.group(2).trim();
            result.put(key, value);
        }

        return result;
    }

    /**
     * 简单的分割解析方法（适用于格式规整的情况）
     * @param input 输入字符串
     * @return 解析后的键值对Map
     */
    public static Map<String, String> parseBySplit(String input) {
        Map<String, String> result = new HashMap<>();

        // 移除首尾的方括号
        String cleanedInput = input.trim();
        if (cleanedInput.startsWith("[") && cleanedInput.endsWith("]")) {
            cleanedInput = cleanedInput.substring(1, cleanedInput.length() - 1);
        }

        // 按空格分割，但保留值中的空格
        String[] pairs = cleanedInput.split("\\s+(?=\\w+=)");

        for (String pair : pairs) {
            int equalsIndex = pair.indexOf('=');
            if (equalsIndex > 0) {
                String key = pair.substring(0, equalsIndex);
                String value = pair.substring(equalsIndex + 1);
                result.put(key, value);
            }
        }

        return result;
    }

    /**
     * 从文本中提取第一个 [] 包裹的键值对字符串并转换为 Map
     *
     * @param text 包含键值对的原始文本
     * @return 包含键值对的 Map
     * @throws IllegalArgumentException 如果格式不正确
     */
    public static Map<String, String> parseKeyValuePairs(String text) {
        if (text == null || text.trim().isEmpty()) {
            throw new IllegalArgumentException("Input text cannot be null or empty");
        }

        // 查找第一个 [ 和对应的 ]
        int start = text.indexOf('[');
        int end = text.indexOf(']', start + 1);

        if (start == -1 || end == -1) {
            throw new IllegalArgumentException("No valid [] pair found in text");
        }

        // 提取 [] 内的内容
        String content = text.substring(start + 1, end).trim();
        if (content.isEmpty()) {
            return new HashMap<>(); // 返回空Map
        }

        // 分割键值对
        String[] pairs = content.split("\\s+");
        Map<String, String> result = new HashMap<>();

        for (String pair : pairs) {
            // 分割键和值
            int equalSign = pair.indexOf('=');
            if (equalSign == -1) {
                throw new IllegalArgumentException("Invalid key-value pair format: " + pair);
            }

            String key = pair.substring(0, equalSign).trim();
            String value = pair.substring(equalSign + 1).trim();

            if (key.isEmpty()) {
                throw new IllegalArgumentException("Key cannot be empty in pair: " + pair);
            }

            result.put(key, value);
        }

        return result;
    }
    public static void main(String[] args) {
        String input = "[name=非工作时间访问 riskLevel=中 riskMain=账号 appName=蜜罐系统-企信外网 riskDesc=账号在2025-04-27，通过47.94.211.49客户端IP在非常用访问时间2025-04-27 15:38:54，进行了业务访问]";

        System.out.println("=== 使用正则表达式解析 ===");
        Map<String, String> result1 = parseKeyValueString(input);
        for (Map.Entry<String, String> entry : result1.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        System.out.println("\n=== 使用分割方法解析 ===");
        Map<String, String> result2 = parseBySplit(input);
        for (Map.Entry<String, String> entry : result2.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        System.out.println("\n=== 获取特定字段 ===");
        System.out.println("应用名称: " + result1.get("appName"));
        System.out.println("风险等级: " + result1.get("riskLevel"));
        System.out.println("风险描述: " + result1.get("riskDesc"));
    }
}