package convertMgr

import (
	"fmt"
	"sync"
	"time"

	. "Framework/startMgr"
	"goutil/logUtil"
)

var (
	funcMap     = make(map[string]*FuncItem)
	mutex       sync.Mutex
	operateName = "Convert"
)

// 注册方法(如果名称重复会panic)
// name:方法名称（唯一标识）
// moduleType:模块类型
// definition:方法定义
func Register(name string, moduleType ModuleType, definition func() error) {
	mutex.Lock()
	defer mutex.Unlock()

	if _, exists := funcMap[name]; exists {
		panic(fmt.Sprintf("%s已经存在，请重新命名", name))
	}

	funcMap[name] = NewFuncItem(name, moduleType, definition)
}

// 调用所有方法
// 返回值：
// 错误列表
func CallAll() (errList []error) {
	mutex.Lock()
	defer mutex.Unlock()

	for _, item := range funcMap {
		// 调用方法
		if err := item.Call2(operateName); err != nil {
			errList = append(errList, err)
		}
	}

	return
}

// 按照模块类型进行调用
// moduleType:模块类型
// 返回值：
// errList:错误列表
func CallType(moduleType ModuleType) (errList []error) {
	mutex.Lock()
	defer mutex.Unlock()

	startTime := time.Now()
	defer func() {
		logUtil.InfoLog("%v %s 执行总时间:%s", moduleType, operateName, time.Since(startTime))
	}()

	for _, item := range funcMap {
		if item.ModuleType != moduleType {
			continue
		}

		// 调用方法
		if err := item.Call2(operateName); err != nil {
			errList = append(errList, err)
		}
	}

	return
}
