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

import (
	"fmt"

	"wartank/pkg/components/kernel"
	"wartank/pkg/store"
	"wartank/pkg/types"
	"wartank/server/gui"
	"wartank/server/serv_bots"
)

// Server -- главный тип приложения
type Server struct {
	*kernel.Kernel
	store    types.IStore
	servBots *serv_bots.ServBots
	gui      *gui.Gui
}

// NewServer -- возвращает новый объект приложения
func NewServer() (sf *Server, err error) {
	kernel, err := kernel.NewKernel()
	if err != nil {
		return nil, fmt.Errorf("NewServer(): in make IKernel, err=\n\t%w", err)
	}
	sf = &Server{
		Kernel: kernel,
	}
	sf.store, err = store.NewStore(sf)
	if err != nil {
		return nil, fmt.Errorf("NewServer(): in open store, err=%w", err)
	}
	sf.servBots, err = serv_bots.NewServBots(sf)
	if err != nil {
		return nil, fmt.Errorf("NewServer(): in create ServBots, err=%w", err)
	}
	sf.gui, err = gui.NewGui(sf)
	if err != nil {
		return nil, fmt.Errorf("NewServer(): in make Gui, err=\n\t%w", err)
	}
	return sf, nil
}

// Store -- возвращает хранилище
func (sf *Server) Store() types.IStore {
	return sf.store
}

// Run -- запускает сервер бота в работу
func (sf *Server) Run() error {
	// go sf.bot.Run()
	if err := sf.servBots.Load(); err != nil {
		return fmt.Errorf("Server.Run(): in load bots, err=\n\t%w", err)
	}
	sf.gui.Run()
	<-sf.Done()
	// if err := sf._erverWeb.Error(); err != nil {
	// 	return fmt.Errorf("Server.Run(): in work IServHttp, err=\n\t%w", err)
	// }
	// if err := sf.bot.Error(); err != nil {
	// 	return fmt.Errorf("Server.Run(): in work IBot, err=\n\t%w", err)
	// }
	return nil
}

// ServBots -- возвращает словарь ботов
func (sf *Server) ServBots() types.IServBots {
	return sf.servBots
}
