<?php

namespace app\task;

use app\task\time\DemoTime;
use think\Cache;
use think\Console;

/**
 * 定时任务管理器
 * 业务代码执行时间过长,会造成堵塞,请合理安排执行任务
 * Class Kernel
 * @package app\task
 * Author: Panda joeyoung0314@qq.com
 * Gitee: https://gitee.com/xertao
 */
class Kernel{

    /**
     * 定时组
     * 业务代码 业务代码执行时间过长,会造成堵塞,请合理安排执行任务。
     * 过于复杂的业务需求建议搭配异步进行处理,定时任务作为触发功能使用。
     * $this->command('DemoTime','10:08','at');// 每天指定时间点触发
     * $this->command('DemoTime','1','minute');// 默认间隔1分钟触发 daily 单位分钟
     * @return void
     */
    public function schedule()
    {
        $this->command(DemoTime::class,'1','minute');// 默认间隔1分钟触发 daily 单位分钟
    }

    /**
     * 定时任务触发时间
     * @param $class
     * @param string $daily
     * @param string $type
     * @return false|\think\console\Output
     */
    private function command($class,string $daily = '',string $type = 'minute')
    {
        // 按分钟、按每天指定点数
        if (!in_array($type,['minute','at'])) {
            return false;
        }

        if (!empty($daily)) {
            switch ($type){
                case 'minute':
                    $run_time = Cache::get("task_{$class}_{$type}_{$daily}");
                    if (ceil((time() - $run_time) / 60) < $daily){
                        return false;
                    }
                    Cache::set("task_{$class}_{$type}_{$daily}",time());
                    break;
                case 'at':
                    if (date('H:i') != $daily){
                        return false;
                    }
                    break;
                default:
                    return false;
            }
        }

        return (new $class)->execute();
    }
}