package cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.utils;

import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

@Component
public class CronExpressionUtils {

    /**
     * 将秒数转换为cron表达式
     * @param intervalSeconds 间隔秒数
     * @return cron表达式
     */
    public static String secondsToCron(Double intervalSeconds) {
        if (intervalSeconds == null || intervalSeconds <= 0) {
            throw new IllegalArgumentException("间隔秒数必须大于0");
        }

        long seconds = Math.round(intervalSeconds);

        // 如果秒数小于60，使用秒级定时
        if (seconds < 60) {
            return String.format("0/%d * * * * ?", seconds);
        }

        // 如果秒数在60-3599之间，使用分钟级定时
        else if (seconds < 3600) {
            long minutes = seconds / 60;
            if (seconds % 60 != 0) {
                // 如果不是整分钟，需要特殊处理
                return String.format("0 */%d * * * ?", minutes);
            }
            return String.format("0 0/%d * * * ?", minutes);
        }

        // 如果秒数在3600-86399之间，使用小时级定时
        else if (seconds < 86400) {
            long hours = seconds / 3600;
            if (seconds % 3600 != 0) {
                // 如果不是整小时，转换为分钟
                long minutes = seconds / 60;
                return String.format("0 0/%d * * * ?", minutes);
            }
            return String.format("0 0 0/%d * * ?", hours);
        }

        // 如果大于等于1天，使用天级定时
        else {
            long days = seconds / 86400;
            if (seconds % 86400 != 0) {
                // 如果不是整天，转换为小时
                long hours = seconds / 3600;
                return String.format("0 0 0/%d * * ?", hours);
            }
            return String.format("0 0 0 */%d * ?", days);
        }
    }

    /**
     * 将秒数转换为固定延迟的cron表达式（从0秒开始）
     * @param intervalSeconds 间隔秒数
     * @return cron表达式
     */
    public String secondsToFixedRateCron(Double intervalSeconds) {
        if (intervalSeconds == null || intervalSeconds <= 0) {
            throw new IllegalArgumentException("间隔秒数必须大于0");
        }

        long seconds = Math.round(intervalSeconds);

        // 计算分钟和剩余秒数
        long minutes = seconds / 60;
        long remainingSeconds = seconds % 60;

        long remainingMinutes;
        if (minutes == 0) {
            // 小于1分钟，只使用秒
            return String.format("*/%d * * * * ?", seconds);
        } else if (minutes < 60) {
            // 小于1小时
            if (remainingSeconds == 0) {
                return String.format("0 */%d * * * ?", minutes);
            } else {
                // 有剩余秒数，需要更复杂的表达式
                return String.format("%d */%d * * * ?", remainingSeconds, minutes);
            }
        } else if (minutes < 1440) {  // 小于24小时
            long hours = minutes / 60;
            remainingMinutes = minutes % 60;

            if (remainingMinutes == 0 && remainingSeconds == 0) {
                return String.format("0 0 */%d * * ?", hours);
            } else if (remainingSeconds == 0) {
                return String.format("0 %d */%d * * ?", remainingMinutes, hours);
            } else {
                return String.format("%d %d */%d * * ?", remainingSeconds, remainingMinutes, hours);
            }
        } else {
            // 大于等于1天
            long days = minutes / 1440;
            long remainingHours = (minutes % 1440) / 60;
            remainingMinutes = minutes % 60;

            if (remainingHours == 0 && remainingMinutes == 0 && remainingSeconds == 0) {
                return String.format("0 0 0 */%d * ?", days);
            } else {
                // 简化处理，转换为小时
                long totalHours = (days * 24) + remainingHours;
                if (remainingMinutes == 0 && remainingSeconds == 0) {
                    return String.format("0 0 */%d * * ?", totalHours);
                } else {
                    return String.format("%d %d */%d * * ?",
                            remainingSeconds, remainingMinutes, totalHours);
                }
            }
        }
    }

    /**
     * 验证cron表达式是否有效
     * @param cronExpression cron表达式
     * @return 是否有效
     */
    public boolean isValidCron(String cronExpression) {
        if (!StringUtils.hasText(cronExpression)) {
            return false;
        }

        try {
            new CronTrigger(cronExpression);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取友好的时间描述
     * @param intervalSeconds 间隔秒数
     * @return 时间描述
     */
    public String getIntervalDescription(Double intervalSeconds) {
        if (intervalSeconds == null) {
            return "未设置";
        }

        long seconds = Math.round(intervalSeconds);

        if (seconds < 60) {
            return seconds + "秒";
        } else if (seconds < 3600) {
            return (seconds / 60) + "分" + (seconds % 60) + "秒";
        } else if (seconds < 86400) {
            return (seconds / 3600) + "小时" + ((seconds % 3600) / 60) + "分";
        } else {
            return (seconds / 86400) + "天" + ((seconds % 86400) / 3600) + "小时";
        }
    }
}