package mockkernel

import (
	"context"

	"wartank/pkg/components/kernel/wgname"
	"wartank/pkg/types"
)

/*
	Мок-объект для имитации объекта ядра приложения.
	Нужен из-за возникающей циклической ссылки.

	ВНИМАНИЕ!!!!!

	Slog_ присваивать руками !!!!
*/

// MockKernel -- мок-объект ядра приложения
type MockKernel struct {
	ctxBg    context.Context // Глобальный неотменяемый контекст приложения
	ctxApp   context.Context // глобальный отменяемый контекст приложения
	fnCancel func()          // Функия глобальной отмены контекста приложения
	wg       *wgname.WgName  // Объект группового ожидания
	Slog_    types.ISlog     // Двойной логер
}

// NewMockKernel -- возвращает новый *MockKernel
func NewMockKernel() *MockKernel {
	sf := &MockKernel{
		ctxBg: context.Background(),
		wg:    wgname.NewWgName(),
	}
	sf.ctxApp, sf.fnCancel = context.WithCancel(sf.ctxBg)
	return sf
}

// Wg -- возвращает объект групповой сихнронизации
func (sf *MockKernel) Wg() types.IWgName {
	return sf.wg
}

// CtxApp -- возвращает глобальный контекст приложения
func (sf *MockKernel) CtxApp() context.Context {
	return sf.ctxApp
}

// Done -- возвращает канал отмены контекста приложения
func (sf *MockKernel) Done() <-chan struct{} {
	return sf.ctxApp.Done()
}

// CancelApp -- отменяет глобальный контекст приложения
func (sf *MockKernel) CancelApp() {
	// fmt._rintf("MockKernel.CancelApp()\n")
	sf.fnCancel()
}

// Slog -- возвращает хранимый логгер
func (sf *MockKernel) Slog() types.ISlog {
	return sf.Slog_
}
