package com.njzscloud.common.sichen.config;

import com.njzscloud.common.sichen.contant.TaskLogLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Getter
@Setter
@ToString
@ConfigurationProperties("sichen.task")
public class TaskProperties {

    /**
     * 是否启用
     */
    private boolean enable = false;

    /**
     * 是否启用数据库任务，默认关闭
     */
    private boolean enableDatabase = true;
    /**
     * 调度器配置
     */
    private Scheduler scheduler = new Scheduler();
    /**
     * 执行器配置
     */
    private Executor executor = new Executor();
    /**
     * 日志配置
     */
    private Logger logger = new Logger();

    @Getter
    @Setter
    @ToString
    @Accessors(chain = true)
    public static class Scheduler {

        /**
         * 任务扫描频率（秒）
         */
        private int scanPeriod = 5;
        /**
         * 补偿时间（秒），0-->忽略，等待下次调度、N-->N 秒内错过的任务将立即触发一次
         */
        private int compensation = 0;

        /**
         * 调度器名称
         */
        private String poolName = "调度器";

        /**
         * 是否使用虚拟线程
         */
        private boolean virtual = true;
    }

    @Getter
    @Setter
    @ToString
    @Accessors(chain = true)
    public static class Executor {

        /**
         * 执行器名称
         */
        private String poolName = "执行器";
        /**
         * 是否使用虚拟线程
         */
        private boolean virtual = true;
        /**
         * 核心线程数（平台线程）
         */
        private int corePoolSize = 0;
        /**
         * 最大线程数（平台线程）
         */
        private int maxPoolSize = Integer.MAX_VALUE;
        /**
         * 线程空闲时间（平台线程）
         */
        private long keepAliveSeconds = 60;
        /**
         * 一级队列（平台线程）
         */
        private int windowCapacity = 20;
        /**
         * 二级队列（平台线程）
         */
        private int standbyCapacity = 8192;
    }

    @Getter
    @Setter
    @ToString
    @Accessors(chain = true)
    public static class Logger {
        /**
         * 是否启用日志
         */
        private boolean enable = true;

        /**
         * 日志留存时间（天），最小只能为 1
         */
        private int history = 15;

        /**
         * 全局日志等级
         */
        private TaskLogLevel logLevel = TaskLogLevel.DEBUG;

    }
}
