package managecenterMgr

import (
	"encoding/json"
	"errors"
	"fmt"

	"Framework/managecenterModel"
	. "Framework/managecenterModel"
	"goutil/logUtil"
	"goutil/webUtil"
)

var (
	areaMap  = make(map[int32]*Area, 128)
	areaHash string
)

// 重新加载大区数据
func reloadArea(isInit bool) error {
	//logUtil.DebugLog("开始刷新大区列表")

	// 连接服务器，以获取数据
	url := getManageCenterUrl("/API/AreaList.ashx")

	// 定义请求参数
	postDict := make(map[string]string)
	postDict["HashValue"] = areaHash

	//请求url,请求头
	header := webUtil.GetFormHeader()
	transport := webUtil.NewTransport()
	transport.DisableKeepAlives = true
	transport = webUtil.GetTimeoutTransport(transport, 30)

	statusCode, returnBytes, err := webUtil.PostMapData(url, postDict, header, transport)
	//statusCode, returnBytes, err := webUtil.PostMapData(url, postDict, header, nil)
	if err != nil {
		logUtil.ErrorLog(fmt.Sprintf("获取大区列表出错，url:%s,错误信息为:%s", url, err))
		return err
	}
	if statusCode != 200 {
		logUtil.ErrorLog(fmt.Sprintf("获取大区列表出错，url:%s,错误码为:%d", url, statusCode))
		return err
	}

	// 解析返回值
	returnObj := new(ReturnObject)
	if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
		logUtil.ErrorLog(fmt.Sprintf("获取大区列表出错，反序列化返回值出错，错误信息为：%s, str:%s", err, string(returnBytes)))
		return err
	}

	// 判断返回状态是否为成功
	if returnObj.Code != 0 {
		// 数据没有变化，所以没有获取到新的数据，不能算错误。
		if returnObj.Code == 47 || returnObj.Message == "DataNotChanged" {
			//如果本地集合为空，且数据又没变化时，重新初始化一下本地hash值
			if len(areaMap) == 0 {
				areaHash = ""
			}
			return nil
		} else {
			msg := fmt.Sprintf("获取大区列表出错，返回状态：%d，信息为：%s", returnObj.Code, returnObj.Message)
			logUtil.ErrorLog(msg)
			return errors.New(msg)
		}
	}

	// 解析Data
	tmpAreaList := make([]*Area, 0, 128)
	if data, ok := returnObj.Data.(string); !ok {
		msg := "获取大区列表出错，返回的数据不是string类型"
		logUtil.ErrorLog(msg)
		return errors.New(msg)
	} else {
		if err = json.Unmarshal([]byte(data), &tmpAreaList); err != nil {
			logUtil.ErrorLog(fmt.Sprintf("获取大区列表出错，反序列化数据出错，错误信息为：%s", err))
			return err
		}
	}

	//logUtil.DebugLog(fmt.Sprintf("刷新大区信息结束，大区数量:%d", len(tmpAreaList)))

	tmpAreaMap := make(map[int32]*Area)
	for _, item := range tmpAreaList {
		tmpAreaMap[item.AreaId] = item
	}

	// 赋值给最终的areaMap
	areaMap = tmpAreaMap
	areaHash = returnObj.HashValue

	// 通知变更
	mcDataChangeCallBack(managecenterModel.AreaData, isInit)

	return nil
}

// 根据区服ID获取所属大区ID
func GetAreaIdByServerId(serverId int32) (areaId int32, exist bool) {
	for _, item := range areaMap {
		if item.CheckServerIdIsInRange(serverId) {
			areaId = item.AreaId
			exist = true
			return
		}
	}

	return
}

// 根据服务器组id获取大区对象数据
func GetAreaDBByGroupId(groupId int32) (areaDB *Area, exist bool) {
	//如果没有大区数据，返回空
	exist = false
	if areaMap == nil || len(areaMap) < 1 {
		return
	}

	for _, item := range areaMap {
		if item.CheckServerIdIsInRange(groupId) {
			areaDB = item
			exist = true
			break
		}
	}
	return
}

// 获取所有大区信息
func GetAllAreaDB() []*Area {
	tempList := make([]*Area, 8)
	for _, item := range areaMap {
		tempList = append(tempList, item)
	}
	return tempList
}

// 根据大区ID获取大区信息
func GetAreaDBbyAreaID(areaId int32) (areaDB *Area, exist bool) {
	//如果没有大区数据，返回空
	exist = false
	if areaMap == nil || len(areaMap) < 1 {
		return
	}

	if item, ok := areaMap[areaId]; ok {
		areaDB = item
		exist = true
	}
	return
}

// 根据服务器ID获取大区页签信息
func GetAreaLabelDBByGroupId(groupId int32) (areaLabelDB *AreaLabel, exist bool) {
	areaDB, exist := GetAreaDBByGroupId(groupId)
	if !exist {
		return nil, false
	}
	if areaDB.AreaLabelList == nil || len(areaDB.AreaLabelList) < 1 {
		return nil, false

	}
	//校服务器ID是否在大区页签服务器范围内
	for _, item := range areaDB.AreaLabelList {
		if exist := item.CheckServerIdIsInLabelRange(groupId); exist {
			return item, true
		}
	}

	//如果没找到，则返回空
	return nil, false
}
