package com.agent.management.parser;

import com.agent.management.common.exception.BusinessException;

/**
 * 技能名称（folderName / SKILL.md frontmatter name）规范化工具。
 *
 * <p>规范定义：技能名称必须为 kebab-case，仅允许 {@code [a-z0-9-]}，
 * 不得包含大写字母、空格、下划线、中文或其他特殊字符；不得以短横线开头或结尾；
 * 不得包含连续短横线。
 *
 * <p>设计目的：Hermes 等 skill 执行引擎按目录名查找技能，
 * kebab-case 是文件系统友好的稳定标识符；可读性与本地化由 displayName 承载。
 */
public final class SkillNameNormalizer {

    private SkillNameNormalizer() {}

    private static final java.util.regex.Pattern KEBAB_CASE_PATTERN =
            java.util.regex.Pattern.compile("^[a-z0-9]+(-[a-z0-9]+)*$");

    /**
     * 判断字符串是否为合法 kebab-case 技能名称。
     */
    public static boolean isValidKebabCase(String input) {
        return input != null && KEBAB_CASE_PATTERN.matcher(input).matches();
    }

    /**
     * 尽力规范化：转小写，将空格/下划线替换为短横线，合并连续短横线，去首尾短横线。
     * 不删除非 ASCII 字符（如中文），调用方应在 normalize 后调用 {@link #isValidKebabCase} 判定。
     */
    public static String normalize(String input) {
        if (input == null) return "";
        String s = input.trim().toLowerCase();
        // 空格、下划线、连续短横线 → 单个短横线
        s = s.replaceAll("[\\s_]+", "-");
        s = s.replaceAll("-+", "-");
        // 去除首尾短横线
        s = s.replaceAll("^-+|-+$", "");
        return s;
    }

    /**
     * 严格规范化：normalize + 校验，若结果非法则抛出 BusinessException。
     *
     * @param input 用户输入
     * @return 合法 kebab-case 字符串
     * @throws BusinessException 若规范化后仍包含非法字符
     */
    public static String normalizeStrict(String input) {
        String normalized = normalize(input);
        if (!isValidKebabCase(normalized)) {
            throw new BusinessException(
                    "技能名称必须为 kebab-case 格式（仅小写字母、数字、短横线，禁用大写/空格/下划线/中文）: " + input);
        }
        if (normalized.length() > 64) {
            throw new BusinessException("技能名称过长（>64 字符）: " + normalized);
        }
        return normalized;
    }
}
