package queue

import (
	"context"
	"fmt"
	"bdqr-server/app/main/api/internal/svc"
	"bdqr-server/app/main/api/internal/types"

	"github.com/hibiken/asynq"
)

type CronJob struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewCronJob(ctx context.Context, svcCtx *svc.ServiceContext) *CronJob {
	return &CronJob{
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *CronJob) Register() *asynq.ServeMux {
	redisClientOpt := asynq.RedisClientOpt{Addr: l.svcCtx.Config.CacheRedis[0].Host, Password: l.svcCtx.Config.CacheRedis[0].Pass}
	scheduler := asynq.NewScheduler(redisClientOpt, nil)

	// 注册数据清理定时任务（每天凌晨3点）
	task := asynq.NewTask(types.MsgCleanQueryData, nil, nil)
	_, err := scheduler.Register(TASKTIME, task)
	if err != nil {
		panic(fmt.Sprintf("定时任务注册失败:%v", err))
	}

	// 注册解冻佣金扫描定时任务（每2小时执行一次）
	unfreezeScanTask := asynq.NewTask(types.MsgUnfreezeCommissionScan, nil, nil)
	_, err = scheduler.Register("0 */2 * * *", unfreezeScanTask) // 每2小时执行一次（每小时的第0分钟）
	if err != nil {
		panic(fmt.Sprintf("解冻佣金扫描定时任务注册失败:%v", err))
	}

	scheduler.Start()
	fmt.Println("定时任务启动！！！")

	mux := asynq.NewServeMux()
	mux.Handle(types.MsgPaySuccessQuery, NewPaySuccessNotifyUserHandler(l.svcCtx))
	mux.Handle(types.MsgCleanQueryData, NewCleanQueryDataHandler(l.svcCtx))
	mux.Handle(types.MsgAgentProcess, NewAgentProcessHandler(l.svcCtx))
	mux.Handle(types.MsgUnfreezeCommission, NewUnfreezeCommissionHandler(l.svcCtx))
	mux.Handle(types.MsgUnfreezeCommissionScan, NewUnfreezeCommissionScanHandler(l.svcCtx))

	return mux
}
