// package mod_kctx -- модуль контекста ядра
package mod_kctx

import (
	"sync"

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

// ModuleKernelCtx -- модуль контекста ядра
type ModuleKernelCtx struct {
	IKernelModule
	kCtx      IKernelCtx
	kServHttp IKernelServerHttp
	log       ILogBuf
}

var (
	mod   *ModuleKernelCtx
	block sync.Mutex
)

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

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

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

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