/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.dolphinscheduler.server.master.config;

import org.apache.dolphinscheduler.meter.metrics.BaseServerLoadProtectionConfig;

import java.time.Duration;

import lombok.Data;
import lombok.EqualsAndHashCode;

import org.springframework.validation.Errors;

@Data
@EqualsAndHashCode(callSuper = true)
public class MasterServerLoadProtectionConfig extends BaseServerLoadProtectionConfig {

    private int maxConcurrentWorkflowInstances = Integer.MAX_VALUE;

    private Duration maxWorkflowInstanceRuntime = Duration.ofDays(0);

    private Duration maxTaskInstanceRuntime = Duration.ofDays(0);

    public void validate(Errors errors) {
        if (maxConcurrentWorkflowInstances <= 0) {
            errors.rejectValue("maxConcurrentWorkflowInstances", null,
                    "maxConcurrentWorkflowInstances must be greater than 0");
        }
        if (!maxWorkflowInstanceRuntime.isZero() &&
                maxWorkflowInstanceRuntime.compareTo(Duration.ofMinutes(1)) < 0) {
            errors.rejectValue("maxWorkflowInstanceRuntime", null,
                    "maxWorkflowInstanceRuntime must be 0 (disabled) or >= 1m");
        }
        if (!maxTaskInstanceRuntime.isZero() &&
                maxTaskInstanceRuntime.compareTo(Duration.ofMinutes(1)) < 0) {
            errors.rejectValue("maxTaskInstanceRuntime", null, "maxTaskInstanceRuntime must be 0 (disabled) or >= 1m");
        }
    }
}
