// package arena_context -- контекст арены
package arena_context

import (
	"context"
	"wartank/pkg/alias"
	"wartank/pkg/arena/arena_context/arena_state"
	"wartank/pkg/components/kernel/logger"
	"wartank/pkg/components/web_log"
	"wartank/pkg/types"
)

// АренаКонтекст -- контекст арены
type АренаКонтекст struct {
	бот       types.ИБот
	аренаИмя  alias.АренаИмя
	кнт       context.Context
	фнОтмена  func()
	состояние types.ИАренаСостояние
	вЛог      types.ИВебЛог
	лог       types.ИЛоггер
}

// НовАренаКонтекст -- возвращает новый контекст арены
func НовАренаКонтекст(бот types.ИБот, сценаИмя alias.АренаИмя) *АренаКонтекст {
	лог := logger.НовЛоггер("АренаКонтекст " + string(сценаИмя))
	лог.Инфо("НовАренаКонтекст() " + string(сценаИмя) + "\n")
	лог.Паника(бот == nil, "НовАренаКонтекст(): ИБот==nil")
	лог.Паника(сценаИмя == "", "НовАренаКонтекст(): сценаИмя не задано")
	кнт, фнОтмена := context.WithCancel(бот.Контекст())
	сам := &АренаКонтекст{
		бот:       бот,
		аренаИмя:  сценаИмя,
		кнт:       кнт,
		фнОтмена:  фнОтмена,
		состояние: arena_state.НовАренаСостояние(),
		вЛог:      web_log.НовВебЛог(true),
		лог:       лог,
	}
	_ = types.ИАренаКонтекст(сам)
	return сам
}

// Лог -- возвращает лог арены
func (сам *АренаКонтекст) ВебЛог() types.ИВебЛог {
	return сам.вЛог
}

// АренаСостояние -- состояние арены
func (сам *АренаКонтекст) АренаСостояние() types.ИАренаСостояние {
	return сам.состояние
}

// Отмена -- отменяет контекст арены
func (сам *АренаКонтекст) Отмена() {
	сам.фнОтмена()
}

// Кнт -- возвращает контекст арены
func (сам *АренаКонтекст) Контекст() context.Context {
	return сам.кнт
}

// Имя -- возвращает имя арены
func (сам *АренаКонтекст) Имя() alias.АренаИмя {
	return сам.аренаИмя
}

// Бот -- возвращает бота сцены
func (сам *АренаКонтекст) Бот() types.ИБот {
	return сам.бот
}
