package com.multictrl.modules.job.utils;

import cn.hutool.core.util.StrUtil;
import org.quartz.CronExpression;

import java.util.List;
import java.util.stream.Collectors;

/**
 * cron表达式生成器
 *
 * @author Sdy
 * @since 2025/6/27
 */
public class CronGenerator {

    /**
     * 1. 某一天的几点执行（年、月、日、小时、分钟）
     *
     * @param year   年（如 2024）
     * @param month  月（1-12）
     * @param day    日期（1-31）
     * @param hour   小时（0-23）
     * @param minute 分钟（0-59）
     * @return Cron 表达式
     */
    public static String generateOnceCron(int year, int month, List<Integer> day, int hour, int minute) {
        return String.format("0 %d %d %d %d ? %d", minute, hour, day.get(0), month, year);
    }

    /**
     * 2. 每天的几点执行（小时、分钟）
     *
     * @param hour   小时（0-23）
     * @param minute 分钟（0-59）
     * @return Cron 表达式
     */
    public static String generateDailyCron(int hour, int minute) {
        return String.format("0 %d %d * * ? *", minute, hour);
    }

    /**
     * 3. 每周的周几几点执行（周几、小时、分钟）
     *
     * @param dayOfWeek 周几（1-7，1=周一）
     * @param hour      小时（0-23）
     * @param minute    分钟（0-59）
     * @return Cron 表达式
     */
    public static String generateWeeklyCron(List<Integer> dayOfWeek, int hour, int minute) {
        // 转换星期表示（将国内习惯的1-7转换为Cron表达式的1-7）
        // 国内习惯：1=周一, 2=周二, 3=周三, 4=周四, 5=周五, 6=周六, 7=周日
        // Cron表达式：1=周日, 2=周一, 3=周二, 4=周三, 5=周四, 6=周五, 7=周六
        List<Integer> cronDays = dayOfWeek.stream()
                .map(d -> {
                    if (d == 7) return 1; // 7(周日) → 1(周日)
                    return d + 1;          // 1(周一)→2, 2(周二)→3, ... 6(周六)→7
                })
                .collect(Collectors.toList());

        return String.format("0 %d %d ? * %s *", minute, hour, StrUtil.join(",", cronDays));
    }

    /**
     * 4. 每月的几号几点执行（日期、小时、分钟）
     *
     * @param dayOfMonth 日期（1-31）
     * @param hour       小时（0-23）
     * @param minute     分钟（0-59）
     * @return Cron 表达式
     */
    public static String generateMonthlyCron(List<Integer> dayOfMonth, int hour, int minute) {
        return String.format("0 %d %d %s * ? *", minute, hour, StrUtil.join(",", dayOfMonth));
    }

    // 可选：验证 Cron 表达式是否合法（需引入 quartz 或 cronutils 依赖）
    public static boolean isValid(String cronExpression) {
        try {
            new CronExpression(cronExpression); // 需要 quartz 依赖
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    //获取cron表达式
    public static String getCron(Integer cronType, Integer year, Integer month, List<Integer> day, Integer hour, Integer minute) {
        return switch (cronType) {
            case 1 -> generateOnceCron(year, month, day, hour, minute);
            case 2 -> generateDailyCron(hour, minute);
            case 3 -> generateWeeklyCron(day, hour, minute);
            case 4 -> generateMonthlyCron(day, hour, minute);
            default -> null;
        };
    }
}
