package global

import (
	"fmt"
	"main/common"
	"main/constant"
	"q5"
)

var modules [constant.MAX_MODULE_IDX]q5.Module
var initOrders = []int32{
	constant.ROUTER_MGR_MODULE_IDX,
	constant.TASK_MGR_MODULE_IDX,
	constant.CACHE_MGR_MODULE_IDX,
	constant.SERVICE_MGR_MODULE_IDX,
	constant.MODEL_MGR_MODULE_IDX,
}

var app common.App
var routerMgr common.RouterMgr
var taskMgr common.TaskMgr
var cacheMgr common.CacheMgr
var serviceMgr common.ServiceMgr
var modelMgr common.ModelMgr

func GetApp() common.App {
	return app
}

func GetRouterMgr() common.RouterMgr {
	return routerMgr
}

func GetTaskMgr() common.TaskMgr {
	return taskMgr
}

func GetCacheMgr() common.CacheMgr {
	return cacheMgr
}

func GetServiceMgr() common.ServiceMgr {
	return serviceMgr
}

func RegModule(idx int32, m q5.Module) {
	fmt.Printf("RegModule module %d\n", idx)
	modules[idx] = m
	switch idx {
	case constant.APP_MODULE_IDX:
		{
			app = m.(common.App)
		}
	case constant.ROUTER_MGR_MODULE_IDX:
		{
			routerMgr = m.(common.RouterMgr)
		}
	case constant.TASK_MGR_MODULE_IDX:
		{
			taskMgr = m.(common.TaskMgr)
		}
	case constant.CACHE_MGR_MODULE_IDX:
		{
			cacheMgr = m.(common.CacheMgr)
		}
	case constant.SERVICE_MGR_MODULE_IDX:
		{
			serviceMgr = m.(common.ServiceMgr)
		}
	case constant.MODEL_MGR_MODULE_IDX:
		{
			modelMgr = m.(common.ModelMgr)
		}

	default:
		{
			panic("unknow module")
		}
	}
}

func InitModules() {
	for _, val := range initOrders {
		fmt.Printf("init module %d\n", val)
		modules[val].Init()
	}
}

func UnInitModules() {
	for _, val := range initOrders {
		fmt.Printf("unInit module %d", val)
		modules[val].UnInit()
	}
}
