package xtools.boot.job.xxl.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import xtools.core.StringUtils;

/**
 * <p>Title : XxlJobConfig</p>
 * <p>Description : XxlJobConfig</p>
 * <p>DevelopTools : Idea_x64_v2026.1</p>
 * <p>DevelopSystem : macOS Sequoia 15.7.5</p>
 * <p>Company : org.xujun</p>
 *
 * @author : XuJun
 * @version : 5.0.0
 * @date : 2026/3/10 14:06
 */
@Slf4j
@Configuration
public class XxlJobConfig {

    /**
     * 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔.执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
     */
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    /**
     * 调度中心通讯TOKEN [选填]:非空时启用;
     */
    @Value("${xxl.job.admin.accessToken}")
    private String accessToken;

    /**
     * 调度中心通讯超时时间[选填]，单位秒;默认3s;
     */
    @Value("${xxl.job.admin.timeout}")
    private int timeout;

    /**
     * 执行器启用开关 [选填]:默认开启，关闭时不进行执行器初始化;
     */
    @Getter
    @Value("${xxl.job.executor.enabled:false}")
    private Boolean enabled;

    /**
     * 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
     */
    @Value("${xxl.job.executor.appName}")
    private String appName;

    /**
     * 执行器注册 [选填]:优先使用该配置作为注册地址，为空时使用内嵌服务 ”IP:PORT“ 作为注册地址.从而更灵活支持容器类型执行器动态IP和动态映射端口问题.
     */
    @Value("${xxl.job.executor.address}")
    private String address;

    /**
     * 执行器IP [选填]:默认为空表示自动获取IP，多网卡时可手动设置指定IP，该IP不会绑定Host仅作为通讯使用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
     */
    @Value("${xxl.job.executor.ip}")
    private String ip;

    /**
     * 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999，单机部署多个执行器时，注意要配置不同执行器端口;
     */
    @Value("${xxl.job.executor.port}")
    private int port;

    /**
     * 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
     */
    @Value("${xxl.job.executor.logPath}")
    private String logPath;

    /**
     * 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
     */
    @Value("${xxl.job.executor.logRetentionDays}")
    private int logRetentionDays;

    /**
     * 任务扫描排除路径 [选填] :任务扫描时忽略指定包路径下的Bean;支持配置包路径前缀，多个逗号分隔;
     */
    @Value("${xxl.job.executor.excludedPackage}")
    private String excludedPackage;

    /**
     * xxl-job 执行器
     *
     * @return xxl-job 执行器
     */
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setTimeout(timeout);
        xxlJobSpringExecutor.setEnabled(enabled);
        xxlJobSpringExecutor.setAppname(appName);
        if (StringUtils.isNotBlank(address)) {
            xxlJobSpringExecutor.setAddress(address);
        }
        if (StringUtils.isNotBlank(ip)) {
            xxlJobSpringExecutor.setIp(ip);
        }
        if (port > 0) {
            xxlJobSpringExecutor.setPort(port);
        }
        if (StringUtils.isNotBlank(logPath)) {
            xxlJobSpringExecutor.setLogPath(logPath);
        }
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        if (StringUtils.isNotBlank(excludedPackage)) {
            xxlJobSpringExecutor.setExcludedPackage(excludedPackage);
        }
        return xxlJobSpringExecutor;
    }

}
