package cron

import (
	"gadmin/config"
	"gadmin/internal/antiCheating"
	"gadmin/internal/cron/jobs"
	"os"
	"time"

	"github.com/go-redis/redis"
	"github.com/jinzhu/now"
	"github.com/robfig/cron/v3"
	"github.com/sirupsen/logrus"
)

var cronTab *cron.Cron

func init() {
	cronTab = cron.New()
}

func RegisterJob() {
	cronTab.AddFunc("@every 30s", SyncOrders) // 每30秒同步一次支付订单
	// cronTab.AddFunc("@every 70s", GameAlarm)    // 每70秒监测一次服务进程
	cronTab.AddFunc("@every 300s", SyncChannel) // 每300秒同步一次渠道用户
	cronTab.AddFunc("@every 600s", SyncChapter) // 每10分钟同步一次章节进度
	cronTab.AddFunc("@every 600s", BackupEmail) // 每10分钟备份一次邮件
	//cronTab.AddFunc("@every 600s", BackupNotice) // 每10分钟备份一次广播
	cronTab.AddFunc("@every 600s", LevelOutput) // 每10分钟同步一次等级产出

	cronTab.AddFunc("5 6 * * *", RolesCount)         // 6点 5分 统计角色等级
	cronTab.AddFunc("15 6 * * *", HaveRoles)         // 6点 15分 统计拥有角色数据
	cronTab.AddFunc("25 6 * * *", ChangedStatistics) // 6点 25分 统计玩家消费，至少预留20分钟
	//cronTab.AddFunc("5 1 * * *", BackupRedisJob)     // 1点 5分  备份redis历史key （正式服运行）
	//cronTab.AddFunc("* 4 * * *", DownloadBackupJob)      // 4点 下载备份数据 （测试服运行）
	cronTab.AddFunc("@every 2h", SyncChatLog) //同步客服聊天记录
	cronTab.AddFunc("@every 1h", AntiCheating)

	// test
	// SyncChapter()
	// SyncChannel()
}

//////////////////////// 次日任务

func BackupRedisJob() {
	jobs.BackupRedis.Run()
}

func DownloadBackupJob() {
	jobs.DownloadBackup.Run()
}

func RolesCount() {
	jobs.RolesCount.Run()
}

func HaveRoles() {
	jobs.HaveRoles.Run()
}

///////////////////// 周期任务

func SyncOrders() {
	jobs.SyncOrders.Run()
}

func SyncChatLog() {
	jobs.SyncCustomerServiceChatLog.Run()
}

func SyncChatLogDiscover() {
	jobs.SyncChatLogDiscover.Run()
}

func SyncChapter() {
	jobs.SyncChapter.Run()
}

func BackupEmail() {
	jobs.BackupEmail.Run()
}

func BackupNotice() {
	jobs.BackupNotice.Run()
}

func ChangedStatistics() {
	jobs.Changed.Run()
}

func StatisticsDPS() {
	//jobs.StatisticsDPS.Run()
}

//func EquipmentStill() {
//	jobs.EquipmentStill.Run()
//}

func RoleStill() {
	jobs.RoleStill.Run()
}

func SyncChannel() {
	jobs.SyncChannel.Run()
}

func OldGuide() {
	jobs.OldGuide.Run()
}

func FilterInitDps() {
	jobs.FilterInitDps.Run()
}

func JoinChannel() {
	jobs.JoinChannel.Run()
}

func JoinChannelByTable(table string) {
	jobs.JoinChannel.SetTable(table)
}

func ExchangePray() {
	jobs.ExchangePray.Run()
}

func Logins() {
	jobs.Logins.Run()
}

func ConvPvpKey() {
	jobs.ConvPvpKey.Run()
}

func Repay38() {
	//jobs.Repay38.Run()
}

func MaxTalents() {
	jobs.MaxTalents.Run()
}

func LevelOutput() {
	jobs.LevelOutput.Run()
}

// func GameAlarm() {
// 	jobs.GameAlarm.Run()
// }

func Migrate(table string) {
	jobs.Migrate.Run(table)
}

func SuppleOrderAt() {
	jobs.SuppleOrderAt.Run()
}

func MigrateZoneBonus() {
	jobs.MigrateZoneBonus.Run()
}

func DownloadJson(jsonVersion string) {
	//jobs.NewSyncGoodsJson().Run(jsonVersion)
}

func AntiCheating() {
	yearMonth := time.Now().Format("200601")
	combat := antiCheating.NewCombat(antiCheating.WithYearMonth(yearMonth))
	combat.Run()
}

func SubMessage() {
	// 非正式环境运行
	if os.Getenv("GIN_MODE") != "release" && os.Getenv("ADMIN_IS_LOCAL") != "1" {
		return
	}

	config.SubMessage("queue.advOrigin", func(msg *redis.Message) {
		jobs.SyncChannel.Trigger()
	})
}

func Run() {
	go SubMessage()
	RegisterJob()
	cronTab.Start()

}

func RunLast() {
	BackupRedisJob()
	DownloadBackupJob()
	RolesCount()
	HaveRoles()
}

func RunSingle(typ string, days int) {
	logrus.Warn("RunSingle, typ:", typ, " , days:", days)
	yesterday := time.Now()
	for i := 0; i < days; i++ {
		logrus.Infoln(typ, i)
		switch typ {
		case "haveRoles":
			jobs.HaveRoles.RunWithDate(now.With(yesterday.AddDate(0, 0, -1-i)))
		default:
			panic("不被支持的参数")
		}
		time.Sleep(3 * time.Second)
	}
}
