package service

import (
	"encoding/json"
	"fengkuangGameServerJob/dao"
	"strconv"
	"strings"
)

const (
	ItemStorage = 8 //粮草的资源ID
)

// Resource 资源相关
type Resource struct {
	ID     int
	Amount int
}

// MountMissionConf 坐骑任务配置
type MountMissionConf struct {
	DataMap []*MountMissionDetailConf `json:"mDataMap"`
}

// MountMissionDetailConf 坐骑任务配置详情
type MountMissionDetailConf struct {
	Id             uint8  `json:"f_id"`
	PlaceID        uint8  `json:"f_PlaceID"`
	MountNum       uint8  `json:"f_MountNum"`
	MissionOpen    uint8  `json:"f_MissionOpen"`
	MissionTime    int64  `json:"f_MissionTime"`
	PlaceReward    string `json:"f_PlaceReward"`
	MissionPrice   string `json:"f_MissionPrice"`
	PlaceQuality   uint8  `json:"f_PlaceQuality"`
	PlaceRewardRes []Resource
}

// ArenaRewardWeeklyConf 竞技场周奖励
type ArenaRewardWeeklyConf struct {
	DataMap []*ArenaRewardWeekly `json:"mDataMap"`
}

// ArenaRewardDailyConf 竞技场日奖励
type ArenaRewardDailyConf struct {
	DataMap []*ArenaRewardDaily `json:"mDataMap"`
}

type ArenaRewardDetail struct {
	ID      uint8  `json:"f_id"`
	Ranking string `json:"f_Ranking"`
	StatMax uint8  `json:"f_StatMax"`
}

// ArenaRewardWeekly 竞技场周奖励
type ArenaRewardWeekly struct {
	ArenaRewardDetail
	WeeklyReward   string `json:"f_WeeklyReward"`
	WeeklyRewardID uint8  `json:"f_WeeklyRewardID"`
}

// ArenaRewardDaily 竞技场日奖励
type ArenaRewardDaily struct {
	ArenaRewardDetail
	DailyReward   string `json:"f_DailyReward"`
	DailyRewardID uint8  `json:"f_DailyRewardID"`
}

// StationMissionListConf 跑商任务信息
type StationMissionListConf struct {
	DataMap []*StationMissionItem `json:"mDataMap"`
}

// StationMissionItem 跑商任务详情
type StationMissionItem struct {
	Id             uint8  `json:"f_id"`
	MissionId      uint8  `json:"f_MissionID"`
	DestoryTime    int    `json:"f_DestoryTime"`
	LootRewards    string `json:"f_LootRewards"`
	MissionTime    int    `json:"f_MissionTime"`
	DestoryRewards string `json:"f_DestoryRewards"`
	MissionQuality uint8  `json:"f_MissionQuality"`
}

// GetConfCommon 公共获取配置
func GetConfCommon(confName string) (*string, error) {
	//1.先从redis中获取
	conf, err := dao.GetConfByNameCache(confName)
	if err != nil {
		return nil, err
	}
	if len(conf) == 0 {
		//2.redis不存在从数据库里面查找
		confObj := dao.GetConfByName(confName)
		conf = confObj.ConfJsonNew
		//3.设置到缓存
		err = dao.SetConfByNameCache(confName, conf)
	}
	return &conf, err
}

// ParseResources 从字符串中解析出资源信息
func ParseResources(resourceStr string) []Resource {
	tmpFirst := strings.Split(resourceStr, "|")
	resources := make([]Resource, 0, len(tmpFirst))
	for _, v := range tmpFirst {
		tmpValArr := strings.Split(v, "-")
		if len(tmpValArr) != 2 {
			continue
		}
		id, _ := strconv.Atoi(tmpValArr[0])
		amount, _ := strconv.Atoi(tmpValArr[1])
		if id <= 0 || amount <= 0 {
			continue
		}
		resources = append(resources, Resource{
			ID:     id,
			Amount: amount,
		})
	}
	return resources
}

// GetMountMissionConf 获取坐骑任务的配置
func GetMountMissionConf() ([]*MountMissionDetailConf, error) {
	confStr, err := GetConfCommon("Mount_Mission")
	if err != nil {
		return nil, err
	}
	var missionConf MountMissionConf
	err = json.Unmarshal([]byte(*confStr), &missionConf)
	return missionConf.DataMap, err
}

// GetArenaDailyRewardConf 获取竞技场日奖励
func GetArenaDailyRewardConf() ([]*ArenaRewardDaily, error) {
	confStr, err := GetConfCommon("Arena_RankReward_Daily")
	if err != nil {
		return nil, err
	}
	var dailyRewardConf ArenaRewardDailyConf
	err = json.Unmarshal([]byte(*confStr), &dailyRewardConf)
	return dailyRewardConf.DataMap, err
}

// GetArenaWeeklyRewardConf 获取竞技场周奖励
func GetArenaWeeklyRewardConf() ([]*ArenaRewardWeekly, error) {
	confStr, err := GetConfCommon("Arena_RankReward_Weekly")
	if err != nil {
		return nil, err
	}
	var weekRewardConf ArenaRewardWeeklyConf
	err = json.Unmarshal([]byte(*confStr), &weekRewardConf)
	return weekRewardConf.DataMap, err
}

// GetStationMissionsConf 获取跑商任务列表配置
func GetStationMissionsConf() ([]*StationMissionItem, error) {
	confStr, err := GetConfCommon("Station_Mission_List")
	if err != nil {
		return nil, err
	}
	var stationMissionConf StationMissionListConf
	err = json.Unmarshal([]byte(*confStr), &stationMissionConf)
	return stationMissionConf.DataMap, err
}
