package com.easyagents.scheduler;

/**
 * 调度任务的稳定标识，由命名空间和名称组成。
 *
 * @param namespace 业务无关的命名空间
 * @param name 命名空间内唯一的任务名称
 */
public record ScheduleId(String namespace, String name) {

    /** 命名空间最大长度。 */
    public static final int MAX_NAMESPACE_LENGTH = 160;

    /** 任务名称最大长度。 */
    public static final int MAX_NAME_LENGTH = 190;

    /**
     * 校验并创建任务标识。
     *
     * @throws IllegalArgumentException 标识为空、过长或含控制字符时抛出
     */
    public ScheduleId {
        namespace = requireIdentifier(namespace, "namespace", MAX_NAMESPACE_LENGTH);
        name = requireIdentifier(name, "name", MAX_NAME_LENGTH);
    }

    /**
     * 规范化并校验标识片段。
     *
     * @param value 原始值
     * @param field 字段名
     * @param maxLength 最大长度
     * @return 规范化值
     */
    private static String requireIdentifier(String value, String field, int maxLength) {
        if (value == null || value.isBlank()) {
            throw new IllegalArgumentException(field + " must not be blank");
        }
        String normalized = value.trim();
        if (normalized.length() > maxLength) {
            throw new IllegalArgumentException(field + " length must not exceed " + maxLength);
        }
        for (int index = 0; index < normalized.length(); index++) {
            if (Character.isISOControl(normalized.charAt(index))) {
                throw new IllegalArgumentException(field + " must not contain control characters");
            }
        }
        return normalized;
    }

    /**
     * 返回便于日志和诊断使用的稳定文本。
     *
     * @return namespace/name 格式的任务标识
     */
    @Override
    public String toString() {
        return namespace + "/" + name;
    }
}
