package tasks

import (
	"gitee.ltd/lxh/wechat-robot/internal/model"
	"gitee.ltd/lxh/xybot"
	"github.com/go-co-op/gocron/v2"
	"github.com/gofiber/fiber/v2/log"
	"github.com/google/uuid"
	"sync"
)

// 定时任务调度器
var scheduler gocron.Scheduler

// 已启动定时任务的微信机器人
var enabledSyncMessageMap = sync.Map{}
var enabledSyncContactMap = sync.Map{}

// Start
// @description: 启动任务
func Start() {
	var err error
	scheduler, err = gocron.NewScheduler()
	if err != nil {
		log.Panicf("定时任务启动失败: %v", err)
	}

	// 预添加已经确定的任务
	db := model.GetDB()
	// 查询数据库，获取在线的机器人
	var robots []model.Robot
	if err = db.Where("status = 'online'").Find(&robots).Error; err != nil {
		log.Panicf("查询机器人失败: %v", err)
	}
	// 遍历机器人，添加任务
	for _, robot := range robots {
		AddJob(robot) // 添加定时任务
	}

	// 启动定时任务
	scheduler.Start()
	log.Info("定时任务已启动")
}

// AddJob
// @description: 添加任务
func AddJob(robot model.Robot) {
	log.Debugf("开始添加【%s[%s]】的定时任务", robot.Nickname, robot.WechatID)
	// 初始化微信客户端
	robotCli, err := xybot.NewClient(robot.WechatID, robot.ContainerHost, false)
	if err != nil {
		log.Panicf("初始化微信客户端失败: %v", err)
	}

	job, err := scheduler.NewJob(
		gocron.CronJob("*/1 * * * * *", true), // 1秒钟同步一次
		gocron.NewTask(syncMessage, robotCli, robot.ID),
	)
	if err != nil {
		log.Errorf("添加定时任务失败: %v", err)
		return
	}
	// 添加到已启动的任务列表
	enabledSyncMessageMap.Store(robot.ID, job.ID())

	// 添加联系人同步任务
	job, err = scheduler.NewJob(
		gocron.CronJob("0 */1 * * *", true), // 每小时同步一次
		gocron.NewTask(syncContact, robot.ContainerHost, robot.WechatID, robot.ID),
	)
	if err != nil {
		log.Panicf("添加联系人同步任务失败: %v", err)
	}
	// 添加到已启动的任务列表
	enabledSyncContactMap.Store(robot.ID, job.ID())
}

// DeleteJob
// @description: 删除定时任务
// @param robotId
func DeleteJob(robotId uint) {
	// 先取出任务Id
	jobId, ok := enabledSyncMessageMap.Load(robotId)
	if !ok {
		log.Errorf("定时任务不存在，robotId: %d", robotId)
		return
	}
	if err := scheduler.RemoveJob(jobId.(uuid.UUID)); err != nil {
		log.Errorf("删除定时任务失败: %v", err)
		return
	}
	// 删除已启动的任务列表
	enabledSyncMessageMap.Delete(robotId)

	// 删除联系人同步任务
	jobId, ok = enabledSyncContactMap.Load(robotId)
	if !ok {
		log.Errorf("联系人同步任务不存在，robotId: %d", robotId)
		return
	}
	if err := scheduler.RemoveJob(jobId.(uuid.UUID)); err != nil {
		log.Errorf("删除联系人同步任务失败: %v", err)
		return
	}
	// 删除已启动的任务列表
	enabledSyncContactMap.Delete(robotId)
}
