package managecenterMgr

import (
	"fmt"
	"strings"
	"time"

	"Framework/goroutineMgr"
	"Framework/initMgr"
	"Framework/managecenterModel"
	"goutil/logUtil"
)

var (
	mcAPIUrl        string
	mcDataSwitchObj *ManageCenterDataSwitch
	initSuccessObj  = initMgr.NewInitSuccess("managecenterMgr")

	//数据变更通知回调
	mDataChangeCallBackFunc func(managecenterModel.MCDataType) error
)

// 注册初始化成功的通道
// name:模块名称
// ch:通道对象
func RegisterInitSuccess(name string, ch chan bool) {
	initSuccessObj.Register(name, ch)
}

// 注册MC数据变更通知回调函数
// handler:回调方法
func RegisterDataChangeCallBackFunc(handler func(managecenterModel.MCDataType) error) {
	mDataChangeCallBackFunc = handler
}

// Start ...启动ManageCenter管理器
// manageCenterAPIUrl:ManageCenter对外提供的API
// manageCenterDataSwitchObj:ManageCenter数据获取开关对象
func Start(manageCenterAPIUrl string, manageCenterDataSwitchObj *ManageCenterDataSwitch) {
	mcAPIUrl = manageCenterAPIUrl
	mcDataSwitchObj = manageCenterDataSwitchObj

	// 先初始化一次数据
	if err := reload(true); err != nil {
		panic(err)
	}

	// 通知初始化成功
	initSuccessObj.Notify()

	// 定时刷新数据
	go func() {
		goroutineName := "managecenterMgr.timelyRefresh"
		goroutineMgr.Monitor(goroutineName)
		defer goroutineMgr.ReleaseMonitor(goroutineName)

		for {
			// 每5秒刷新一次
			time.Sleep(5 * time.Second)

			// 刷新服务器组
			reload(false)
		}
	}()
}

// 重新加载/初始化
func reload(isInit bool) error {
	var err error

	// 加载合作商数据
	if mcDataSwitchObj.AllDataSwitch || mcDataSwitchObj.PartnerDataSwitch {
		if err = reloadPartner(isInit); err != nil && isInit {
			return err
		}
	}

	// 加载服务器数据
	if mcDataSwitchObj.AllDataSwitch || mcDataSwitchObj.ServerDataSwitch {
		if err = reloadServer(isInit); err != nil && isInit {
			return err
		}
	}

	// 加载服务器组数据
	if mcDataSwitchObj.AllDataSwitch || mcDataSwitchObj.ServerGroupDataSwitch {
		if err = reloadServerGroup(isInit); err != nil && isInit {
			return err
		}
	}

	// 加载资源数据
	if mcDataSwitchObj.AllDataSwitch || mcDataSwitchObj.ResourceVersionDataSwitch {
		if err = reloadResourceVersion(isInit); err != nil && isInit {
			return err
		}
	}

	// 加载玩家白名单数据
	if mcDataSwitchObj.AllDataSwitch || mcDataSwitchObj.WhiteListDataSwitch {
		if err = reloadWhiteList(isInit); err != nil && isInit {
			return err
		}
	}

	// 加载大区数据
	if mcDataSwitchObj.AllDataSwitch || mcDataSwitchObj.AreaDataSwitch {
		if err = reloadArea(isInit); err != nil && isInit {
			return err
		}
	}

	return nil
}

// 获取可访问的ManageCenter地址
// suffix:Url后缀
// 返回值:
// 可访问的ManageCenter地址
func getManageCenterUrl(suffix string) string {
	return fmt.Sprintf("%s/%s", strings.TrimRight(mcAPIUrl, "/"), strings.TrimLeft(suffix, "/"))
}

// 回调
// dataType:数据类型
// isInit:是否初始化
func mcDataChangeCallBack(dataType managecenterModel.MCDataType, isInit bool) {
	//如果没注册回调函数，或者是数据初始化，则不回调
	if mDataChangeCallBackFunc == nil || isInit {
		return
	}

	//回调
	err := mDataChangeCallBackFunc(dataType)

	logUtil.ErrorLog(fmt.Sprintf("通知回调出错，DataType:%d,错误信息为:%s", dataType, err))
}
