package server

import (
	"context"
	"github.com/go-co-op/gocron"
	"github.com/go-nunu/nunu-layout-advanced/internal/task"
	"github.com/go-nunu/nunu-layout-advanced/pkg/log"
	"go.uber.org/zap"
	"time"
)

type TaskServer struct {
	log            *log.Logger
	scheduler      *gocron.Scheduler
	userTask       task.UserTask
	gameShieldTask task.GameShieldTask
	wafTask            task.WafTask
}

func NewTaskServer(
	log *log.Logger,
	userTask task.UserTask,
	gameShieldTask task.GameShieldTask,
	wafTask task.WafTask,
) *TaskServer {
	return &TaskServer{
		log:            log,
		userTask:       userTask,
		gameShieldTask: gameShieldTask,
		wafTask:        wafTask,
	}
}
func (t *TaskServer) Start(ctx context.Context) error {
	gocron.SetPanicHandler(func(jobName string, recoverData interface{}) {
		t.log.Error("TaskServer Panic", zap.String("job", jobName), zap.Any("recover", recoverData))
	})

	// eg: crontab task
	t.scheduler = gocron.NewScheduler(time.UTC)
	// if you are in China, you will need to change the time zone as follows
	// t.scheduler = gocron.NewScheduler(time.FixedZone("PRC", 8*60*60))

	//_, err := t.scheduler.Every("3s").Do(func()
	//_, err := t.scheduler.CronWithSeconds("0/3 * * * * *").Do(func() {
	//	err := t.userTask.CheckUser(ctx)
	//	if err != nil {
	//		t.log.Error("CheckUser error", zap.Error(err))
	//	}
	//})
	//if err != nil {
	//	t.log.Error("CheckUser error", zap.Error(err))
	//}

	// 添加游戏盾检查任务 - 每1小时执行
	//_, err := t.scheduler.Cron("0 */1 * * *").Do(func() {
	//	err := t.gameShieldTask.CheckGameShield(ctx)
	//	if err != nil {
	//		t.log.Error("CheckGameShield error", zap.Error(err))
	//	}
	//})
	//if err != nil {
	//	t.log.Error("Register CheckGameShield task error", zap.Error(err))
	//}
	//
	//// 添加游戏盾数据同步任务 - 每天凌晨3点执行
	//_, err = t.scheduler.Cron("0 3 * * *").Do(func() {
	//	err := t.gameShieldTask.SyncAllExpireTimeFromHost(ctx)
	//	if err != nil {
	//		t.log.Error("SyncAllExpireTimeFromHost error", zap.Error(err))
	//	}
	//})
	//if err != nil {
	//	t.log.Error("Register SyncAllExpireTimeFromHost task error", zap.Error(err))
	//}




	_, err := t.scheduler.Cron("0 * * * *").Do(func() {
		err := t.wafTask.SynchronizationTime(ctx)
		if err != nil {
			t.log.Error("同步到期时间失败", zap.Error(err))
		}
	})
	if err != nil {
		t.log.Error("同步到期时间注册任务失败", zap.Error(err))
	}

	_, err = t.scheduler.Cron("0 * * * *").Do(func() {
		err := t.wafTask.StopPlan(ctx)
		if err != nil {
			t.log.Error("停止套餐失败", zap.Error(err))
		}
	})
	if err != nil {
		t.log.Error("停止套餐注册任务失败", zap.Error(err))
	}


	_, err = t.scheduler.Cron("0 * * * *").Do(func() {
		err := t.wafTask.RecoverRecentPlan(ctx)
		if err != nil {
			t.log.Error("续费失败", zap.Error(err))
		}
	})
	if err != nil {
		t.log.Error("续费注册任务失败", zap.Error(err))
	}


	_, err = t.scheduler.Cron("0 * * * *").Do(func() {
		err := t.wafTask.CleanUpStaleRecords(ctx)
		if err != nil {
			t.log.Error("清理过期记录失败", zap.Error(err))
		}
	})
	if err != nil {
		t.log.Error("清理过期记录注册任务失败", zap.Error(err))
	}



	// 使用非阻塞方式启动调度器，添加一条日志表明任务服务已启动
	t.scheduler.StartAsync()
	t.log.Info("task server starting...")
	return nil
}
func (t *TaskServer) Stop(ctx context.Context) error {
	t.scheduler.Stop()
	t.log.Info("TaskServer stop...")
	return nil
}
