use std::time::Duration;
use tokio::time;

/// Scheduled task utility class
///
/// TODO 后续添加cron表达式相关
pub struct SchedulingUtil;

impl SchedulingUtil {
    
    /// 设置一个定时任务，按照指定的时间间隔重复执行
    ///
    /// # 参数
    /// * `task` - 要执行的任务函数，该函数不接受参数且无返回值
    /// * `interval` - 执行间隔时间，单位为秒
    ///
    /// # 返回值
    /// 无返回值
    ///
    /// # 说明
    /// 该函数会创建一个定时器，按照指定的间隔时间无限循环执行传入的任务函数
    pub async fn set_interval(mut task: impl FnMut(), interval: u64) {
        // 创建定时器实例，用于控制任务执行间隔
        let mut interval = time::interval(Duration::from_secs(interval));
        loop {
            // 等待下一个时间点到达
            interval.tick().await;
            // 执行任务函数
            task();
        }
    }

    /// 异步设置超时执行任务的函数
    ///
    /// 该函数会等待指定的超时时间后执行传入的任务闭包
    ///
    /// # 参数
    /// * `task` - 一个只执行一次的闭包函数，在超时结束后被调用
    /// * `timeout` - 超时时间，单位为秒
    ///
    /// # 返回值
    /// 无返回值
    pub async fn set_timeout(task: impl FnOnce(), timeout: u64) {
        // 等待指定的超时时间
        time::sleep(Duration::from_secs(timeout)).await;
        // 执行传入的任务
        task();
    }
}
