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.ИЛоггер   // Двойной логер
}

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

// Хранилище -- возвращает хранилище данных
func (сам *MockKernel) Хранилище() types.ИХранилище {
	return nil
}

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

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

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

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

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