package base

import (
	"context"
	"encoding/json"
	taskService "eta/eta_mini_ht_api/domian/task"
	"time"
)

const (
	FORBIDDEN = "forbidden"
	DEV       = "dev"
	TEST      = "test"
	PROD      = "prod"
)

type TaskType string
type ETATask struct {
	RunMode string
	Name    TaskType
	TaskFn  Task
	Cron    string
}
type TaskDetail struct {
	TaskId    int
	StartTime string
	EndTime   string
	Content   string
}

type Task interface {
	Execute(taskDetail *TaskDetail) error
}

func NewTask(name TaskType, cron string, taskFunc Task, mode string) ETATask {
	return ETATask{
		Name:    name,
		TaskFn:  taskFunc,
		Cron:    cron,
		RunMode: mode,
	}
}

var tasks = make(map[TaskType]*ETATask)

func GetTasks() map[TaskType]*ETATask {
	return tasks
}
func RegisterTask(etaTask *ETATask) {
	if etaTask == nil {
		panic("不能注册空任务")
	}
	if _, ok := tasks[etaTask.Name]; ok {
		panic("请勿重复创建任务:" + etaTask.Name)
	}
	tasks[etaTask.Name] = etaTask
}

func (eta *ETATask) Run(_ context.Context) (err error) {
	details := TaskDetail{
		StartTime: time.Now().Format(time.DateTime),
	}
	runTask := taskService.TaskDTO{
		TaskType: string(eta.Name),
	}
	//启动任务
	taskId, err := taskService.InitAndStartTask(runTask)
	details.TaskId = taskId
	err = eta.TaskFn.Execute(&details)
	details.EndTime = time.Now().Format(time.DateTime)
	detailStr, err := json.Marshal(details)
	//任务状态
	if err != nil {
		taskService.UpdateAndFailedTask(taskId, string(detailStr))
		return
	}
	taskService.UpdateAndSuccessTask(taskId, string(detailStr))
	return
}