// package server -- главный тип приложения, содержит бота, интерфейсы и т.п.
package server

import (
	"wartank/pkg/components/kernel"
	"wartank/pkg/components/kernel/logger"
	"wartank/pkg/types"
	"wartank/server/serv_bots"
	"wartank/server/serv_web"
	"wartank/server/server_stat"
)

// Сервер -- главный тип приложения
type Сервер struct {
	types.ИЯдро
	ботоФерма *serv_bots.БотоФерма
	сервВеб   *serv_web.СервВеб
	сервСтат  types.ИСерверСтат
	лог       types.ИЛоггер
}

// НовСервер -- возвращает новый объект приложения
func НовСервер() *Сервер {
	лог := logger.НовЛоггер("Сервер")
	лог.Инфо("НовСервер()\n")
	сам := &Сервер{
		ИЯдро: kernel.НовЯдро(),
		лог:   лог,
	}
	сам.ботоФерма = serv_bots.НовБотоФерма(сам)
	сам.сервВеб = serv_web.НовСервВеб(сам)
	сам.сервСтат = server_stat.НовСерверСтат(сам)
	return сам
}

// Пуск -- запускает сервер бота в работу
func (сам *Сервер) Пуск() error {
	сам.лог.Инфо("Сервер.Пуск()\n")
	сам.сервВеб.Пуск()
	<-сам.Done()
	return nil
}

// Стат -- возвращает статистику сервера
func (сам *Сервер) Стат() types.ИСерверСтат {
	return сам.сервСтат
}

// ServBots -- возвращает словарь ботов
func (сам *Сервер) ServBots() types.ИБотоФерма {
	return сам.ботоФерма
}
