package scheduler

import (
	"github.com/robfig/cron/v3"
	"sync"
)

var taskList = make(chan *CronTask, 10)
var taskMap = make(map[string]*CronTask)
var lock sync.Mutex
var c = newWithSeconds()

type CronTask struct {
	Name string
	Spec string
	Fn   func()
}

func AddCronTask(task *CronTask) bool {
	lock.Lock()
	defer lock.Unlock()

	if task == nil {
		return false
	}

	_, exist := taskMap[task.Name]
	if exist {
		return false
	}

	taskList <- task

	return true
}

func CronRun() {
	go c.Start()

	//监听任务列表
	go func() {
		defer close(taskList)
		for {
			select {
			case task, ok := <-taskList:
				{
					if ok {
						_, err := c.AddFunc(task.Spec, task.Fn)
						if err != nil {
							panic(err)
						}
					}
				}
			}
		}
	}()
}

func newWithSeconds() *cron.Cron {
	return cron.New(cron.WithParser(cron.NewParser(
		cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor,
	)))
}