package com.easyagents.scheduler;

import java.time.ZoneId;
import java.util.Objects;

/**
 * 带显式时区的 Cron 调度计划。
 *
 * @param expression Quartz Cron 表达式
 * @param zoneId 解释 Cron 表达式的时区
 */
public record CronSchedulePlan(String expression, ZoneId zoneId) implements SchedulePlan {

    /** Quartz 官方 JDBC 表中 Cron 表达式的最大长度。 */
    public static final int MAX_EXPRESSION_LENGTH = 120;

    /** Quartz 官方 JDBC 表中时区标识的最大长度。 */
    public static final int MAX_ZONE_ID_LENGTH = 80;

    /**
     * 校验并创建 Cron 调度计划。
     *
     * @throws IllegalArgumentException 表达式为空时抛出
     * @throws NullPointerException 时区为空时抛出
     */
    public CronSchedulePlan {
        if (expression == null || expression.isBlank()) {
            throw new IllegalArgumentException("cron expression must not be blank");
        }
        expression = expression.trim().replaceAll("\\s+", " ");
        if (expression.length() > MAX_EXPRESSION_LENGTH) {
            throw new IllegalArgumentException(
                "cron expression length must not exceed " + MAX_EXPRESSION_LENGTH
            );
        }
        zoneId = Objects.requireNonNull(zoneId, "zoneId must not be null");
        if (zoneId.getId().length() > MAX_ZONE_ID_LENGTH) {
            throw new IllegalArgumentException(
                "zoneId length must not exceed " + MAX_ZONE_ID_LENGTH
            );
        }
    }
}
