package com.agent.management.parser;

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

/**
 * 工作流名称（name）规范化工具，与 Skill 的 {@code SkillNameNormalizer} 对齐。
 *
 * <p>规范定义：工作流的唯一标识 name 必须为 kebab-case，
 * 仅允许 {@code [a-z0-9-]}，不得包含大写字母、空格、下划线、中文或其他特殊字符；
 * 不得以短横线开头或结尾；不得包含连续短横线。
 *
 * <p>设计目的：作为工作流对外暴露的稳定标识符（URL 路由、外部 API、TagAssignment 等），
 * 与 Skill 的 folderName/name 在语义和格式上保持一致。
 * 可读性与本地化由 displayName 承载。
 */
public final class WorkflowNameNormalizer {

    private WorkflowNameNormalizer() {}

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

    private static final int MAX_LENGTH = 64;

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

    /**
     * 尽力规范化：转小写，将空格/下划线替换为短横线，合并连续短横线，去首尾短横线，
     * 最后剔除非 ASCII 字母数字与短横线字符（中文、特殊符号等）。
     */
    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("^-+|-+$", "");
        s = s.replaceAll("[^a-z0-9-]", "");
        return s;
    }

    /**
     * 严格规范化：normalize + 校验，若结果非法则抛出 BusinessException。
     */
    public static String normalizeStrict(String input) {
        String normalized = normalize(input);
        if (!isValidKebabCase(normalized)) {
            throw new BusinessException(
                    "工作流名称必须为 kebab-case 格式（仅小写字母、数字、短横线，禁用大写/空格/下划线/中文）: " + input);
        }
        return normalized;
    }
}
