// package mod_keeper -- модуль сторожа ядра
package mod_keeper

import (
	"sync"

	"gitp78su.ipnodns.ru/svi/kern/v2/krn/kctx"
	"gitp78su.ipnodns.ru/svi/kern/v2/krn/kmodule"
	"gitp78su.ipnodns.ru/svi/kern/v2/krn/kserv_http"
	. "gitp78su.ipnodns.ru/svi/kern/v2/krn/ktypes"
	"gitp78su.ipnodns.ru/svi/kern/v2/mds/mod_serv_http/http_api"
	"gitp78su.ipnodns.ru/svi/kern/v2/mds/mod_serv_http/page_module"
	"gitp78su.ipnodns.ru/svi/kern/v2/mds/mod_serv_http/page_monolit"
)

// ModuleKeeper -- модуль сторожа
type ModuleKeeper struct {
	IKernelModule
	kCtx      IKernelCtx
	kServHttp IKernelServerHttp
	log       ILogBuf
}

var (
	mod   *ModuleKeeper
	block sync.Mutex
)

// GetModuleKeeper -- возвращает новый модуль сторожа ядра
func GetModuleKeeper() *ModuleKeeper {
	block.Lock()
	defer block.Unlock()
	if mod != nil {
		return nil
	}
	sf := &ModuleKeeper{
		kCtx:          kctx.GetKernelCtx(),
		IKernelModule: kmodule.NewKernelModule("kKeeper"),
		kServHttp:     kserv_http.GetKernelServHttp(),
	}
	sf.log = sf.kCtx.Keeper().Log()
	_ = page_monolit.GetPageMonolit()
	_ = page_module.GetPageModule()

	_ = http_api.NewHttpApi()
	mod = sf
	return sf
}

// Run -- запускает модуль в работу
func (sf *ModuleKeeper) Run() {
	sf.log.Info("ModuleKernelCtx.Run(): module=%v, is run", sf.Name())
	go sf.kServHttp.Run()
}

// IsWork -- признак работы модуля
func (sf *ModuleKeeper) IsWork() bool {
	return sf.kCtx.Wg().IsWork()
}
