package dao

import (
	"fengkuangGameServerJob/model"
	"fengkuangGameServerJob/pkg/util"
	"fmt"
	"github.com/go-redis/redis"
	"gorm.io/gorm"
	"strings"
)

// GetDueMission 获取到期的有序集合
// unixEnd最大的score
func GetDueMission(unixEnd int64) ([]string, error) {
	return Redis().ZRangeByScore(MountMissionKey, redis.ZRangeBy{
		Min:    "(0",
		Max:    fmt.Sprintf("%d", unixEnd),
		Offset: 0,
		Count:  500, //每次一共选择500条,防止数据过多
	}).Result()
}

// SetMission 设置坐骑任务
func SetMission(pipeTx redis.Pipeliner, memberKey string, unixEnd int64) error {
	return pipeTx.ZAdd(MountMissionKey, redis.Z{
		Score:  float64(unixEnd),
		Member: memberKey,
	}).Err()
}

// GetMissionInfo 根据玩家ID+任务地点ID来获取任务信息
func GetMissionInfo(tx *gorm.DB, playerId int, addrId uint8, column []string) (*model.PlayerMountMission, error) {
	var mountMission *model.PlayerMountMission
	columnStr := strings.Join(column, ",")
	err := tx.Select(columnStr).
		Where("player_id = ?", playerId).
		Where("mission_addr_id = ?", addrId).
		Limit(1).
		Find(&mountMission).Error
	return mountMission, err
}

// ResumeMission 任务重新开始
func ResumeMission(tx *gorm.DB, playerId int, addrId uint8, starUnix, endUnix int64) error {
	return tx.Exec(`UPDATE game_player_mount_mission 
SET 
    start_unix = ?,
    end_unix = ?,
    mission_state = 1
WHERE
    player_id = ?  AND mission_addr_id = ?;`, starUnix, endUnix, playerId, addrId).Error
}

// GetMountStorage 根据玩家ID来获取玩家粮仓信息
func GetMountStorage(playerIds []int) []*model.PlayerMountStorage {
	var res []*model.PlayerMountStorage
	err := DB().Select("player_id", "storage_max").Where("player_id IN ?", playerIds).Find(&res).Error
	util.CheckErr(err)
	return res
}

// GetConfByName 根据配置名称获取配置
func GetConfByName(confName string) *model.SysConf {
	var conf model.SysConf
	err := DB().Where("conf_name = ?", confName).Limit(1).Find(&conf).Error
	util.CheckErr(err)
	return &conf
}

// GetConfByNameCache 获取写在缓存里的配置
func GetConfByNameCache(confName string) (string, error) {
	//node与go用配置的不是同一字段
	conf, err := Redis().HGet(SysConfKey, confName).Result()
	if err != nil && err != redis.Nil {
		return "", err
	}
	return conf, nil
}

// SetConfByNameCache 将配置设置到缓存中
func SetConfByNameCache(confName, conf string) error {
	//因为node与go用的不是同一字段
	return Redis().HSet(SysConfKey, confName, conf).Err()
}
