package schedule

import (
	"fmt"
	"github.com/caixw/lib.go/conv"
	"github.com/robfig/cron/v3"
	"log"
	"time"
	"youngee_b_api/app/dao"
	"youngee_b_api/app/entity"
)

func AutoTaskInvalid() error {
	// 新建一个定时任务对象
	crontab := cron.New(cron.WithSeconds()) // 精确到秒
	spec := "0 */5 * * * ?"                 //cron表达式，每5分钟一次
	// "0 0 12 * * ?" 每天中午12点执行

	// 添加定时任务
	// 定时任务1  品牌种草失效自动处理
	_, err1 := crontab.AddFunc(spec, AutoProjectInvalidTask)
	if err1 != nil {
		return err1
	}
	// 定时任务2  电商带货失效自动处理
	_, err2 := crontab.AddFunc(spec, AutoSelectionInvalidTask)
	if err2 != nil {
		return err2
	}
	// 定时任务3  本地生活失效自动处理
	_, err3 := crontab.AddFunc(spec, AutoLocalLifeInvalidTask)
	if err3 != nil {
		return err3
	}

	// 启动定时器
	crontab.Start()
	// 定时任务是另起协程执行的,这里使用 select 简单阻塞.需要根据实际情况进行控制
	//select {} //阻塞主线程停止
	return nil
}

// 定时任务1  品牌种草失效自动处理
func AutoProjectInvalidTask() {
	log.Println("AutoProjectInvalidTask running Start, Time :", time.Now())
	var projectInfos []*entity.Project
	projectInfos, _ = dao.ProjectDAO{}.GetProjectList(6, "project_status")
	// 对于所有未支付的品牌种草项目进行处理
	for _, projectInfo := range projectInfos {
		projectId := projectInfo.ProjectId
		autoTaskId := projectInfo.AutoTaskID
		autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid")
		dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h")
		// 失效时间计算：任务截止时间 + 设置的失效自动执行时间
		timeInvalid := projectInfo.RecruitDdl.Add(dd)
		if projectInfo.AutoFailAt.IsZero() {
			dao.Db.Model(&entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{AutoFailAt: timeInvalid})
		}
		projectNeedMod := entity.Project{}
		dao.Db.Where("project_id = ?", projectId).First(&projectNeedMod)
		//fmt.Println(fmt.Sprintf("品牌种草项目 %s 失效自动处理时间为：%s", projectId, projectNeedMod.AutoFailAt))
		// 如果失效自动处理的时间不为空
		if !projectNeedMod.AutoFailAt.IsZero() {
			timeNow := time.Now()
			// 如果 未失效 && 已经过了失效自动处理的时间
			if projectNeedMod.ProjectStatus < 9 && projectNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
				dao.Db.Model(entity.Project{}).Where("project_id = ?", projectId).Updates(&entity.Project{ProjectStatus: 9, FinishAt: timeInvalid, FailReason: 1})
				fmt.Println(fmt.Sprintf("已更新品牌种草项目 %s 状态为超时未支付的失效状态", projectId))
				dao.Db.Model(entity.ProjectTaskInfo{}).Where("project_id = ?", projectId).Updates(entity.ProjectTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
			}
		}
	}
	log.Println("AutoProjectInvalidTask running End, Time :", time.Now())
}

// 定时任务2  电商带货失效自动处理
func AutoSelectionInvalidTask() {
	log.Println("AutoSelectionInvalidTask running Start, Time :", time.Now())
	var selectionInfos []*entity.SelectionInfo
	selectionInfos, _ = dao.SelectionInfoDAO{}.GetSelectionInfoList(4, "selection_status")
	// 对于所有未支付的电商带货项目进行处理
	for _, selectionInfo := range selectionInfos {
		selectionId := selectionInfo.SelectionID
		autoTaskId := selectionInfo.AutoTaskID
		autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "selection_invalid")
		dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.SelectionInvalid, "") + "h")
		// 失效时间计算：任务截止时间 + 设置的失效自动执行时间
		timeInvalid := selectionInfo.PassAt.Add(dd)
		if selectionInfo.AutoFailAt.IsZero() {
			dao.Db.Model(&entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(&entity.SelectionInfo{AutoFailAt: timeInvalid})
		}
		selectionInfoNeedMod := entity.SelectionInfo{}
		dao.Db.Where("selection_id = ?", selectionId).First(&selectionInfoNeedMod)
		//fmt.Println(fmt.Sprintf("电商带货项目 %s 失效自动处理时间为：%s", selectionId, selectionInfoNeedMod.AutoFailAt))
		// 如果失效自动处理的时间不为空
		if !selectionInfoNeedMod.AutoFailAt.IsZero() {
			timeNow := time.Now()
			// 如果 未失效 && 已经过了失效自动处理的时间
			if selectionInfoNeedMod.SelectionStatus < 5 && selectionInfoNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
				dao.Db.Model(entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(&entity.SelectionInfo{SelectionStatus: 7, FinishAt: timeInvalid, FailReason: 1})
				fmt.Println(fmt.Sprintf("已更新电商带货项目 %s 状态为超时未支付的失效状态", selectionId))
				dao.Db.Model(entity.SelectionInfo{}).Where("selection_id = ?", selectionId).Updates(entity.SelectionTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
			}
		}
	}
	log.Println("AutoSelectionInvalidTask running End, Time :", time.Now())
}

// 定时任务3  本地生活失效自动处理
func AutoLocalLifeInvalidTask() {
	log.Println("AutoLocalLifeInvalidTask running Start, Time :", time.Now())
	var localLifeInfos []*entity.LocalLifeInfo
	localLifeInfos, _ = dao.LocalLifeDao{}.GetLocalLifeList(6, "task_status")
	// 对于所有未支付的本地生活项目进行处理
	for _, localLifeInfo := range localLifeInfos {
		localId := localLifeInfo.LocalID
		autoTaskId := localLifeInfo.AutoTaskID
		autoTaskInfo := dao.InfoAutoTaskDao{}.GetValueByIdFieldName(autoTaskId, "invalid")
		dd, _ := time.ParseDuration(conv.MustString(autoTaskInfo.Invalid, "") + "h")
		// 失效时间计算：任务截止时间 + 设置的失效自动执行时间
		timeInvalid := localLifeInfo.RecruitDdl.Add(dd)
		if localLifeInfo.AutoFailAt.IsZero() {
			dao.Db.Model(&entity.LocalLifeInfo{}).Where("local_id = ?", localId).Updates(&entity.LocalLifeInfo{AutoFailAt: timeInvalid})
		}
		localLifeNeedMod := entity.LocalLifeInfo{}
		dao.Db.Where("local_id = ?", localId).First(&localLifeNeedMod)
		//fmt.Println(fmt.Sprintf("本地生活项目 %s 失效自动处理时间为：%s", localId, localLifeNeedMod.AutoFailAt))
		// 如果失效自动处理的时间不为空
		if !localLifeNeedMod.AutoFailAt.IsZero() {
			timeNow := time.Now()
			// 如果 未失效 && 已经过了失效自动处理的时间
			if localLifeNeedMod.TaskStatus < 9 && localLifeNeedMod.AutoFailAt.Sub(time.Now()) <= 0 {
				dao.Db.Model(entity.LocalLifeInfo{}).Where("local_id = ?", localId).Updates(&entity.LocalLifeInfo{TaskStatus: 9, FinishAt: timeInvalid, FailReason: 1})
				fmt.Println(fmt.Sprintf("已更新本地生活项目 %s 状态为超时未支付的失效状态", localId))
				dao.Db.Model(entity.LocalLifeTaskInfo{}).Where("local_id = ?", localId).Updates(entity.LocalLifeTaskInfo{TaskStage: 3, CompleteStatus: 3, CompleteDate: timeNow})
			}
		}
	}
	log.Println("AutoLocalLifeInvalidTask running End, Time :", time.Now())
}
