// package serv_bots -- словарь ботов сервера
package serv_bots

import (
	"fmt"

	"wartank/pkg/types"
	"wartank/server/serv_bots/dict_warbot"
	"wartank/server/serv_bots/warbot"
)

// ServBots -- словарь ботов на сервере
type ServBots struct {
	server  types.ИСервер
	store   types.IStore
	dictBot *dict_warbot.DictWarBot
}

// NewServBots -- возвращает новый словарь серверных ботов
func NewServBots(server types.ИСервер) (*ServBots, error) {
	if server == nil {
		return nil, fmt.Errorf("NewServBots(): IServer == nil")
	}
	sf := &ServBots{
		server: server,
		store:  server.Store(),
	}
	var err error
	sf.dictBot, err = dict_warbot.NewDictWarBot(server)
	if err != nil {
		return nil, fmt.Errorf("NewServBots(): in create DictWarBot, err=\n\t%w", err)
	}
	return sf, nil
}

// Get -- возвращает боевого бота по имени
func (sf *ServBots) Get(name string) types.ИБот {
	bot := sf.dictBot.Get(name)
	return bot
}

// BotStart -- запускает бота в работу по его имени
func (sf *ServBots) BotStart(name string) error {
	bot := sf.dictBot.Get(name)
	if bot == nil {
		return fmt.Errorf("ServBots.BotStart(): bot(%v) not found", name)
	}
	err := bot.Пуск()
	if err != nil {
		return fmt.Errorf("ServBots.BotStart(): in run bot(%v), err=\n\t%w", name, err)
	}
	return nil
}

// ListBot -- возвращает список существующих ботов
func (sf *ServBots) ListBot() []types.ИБот {
	lst := sf.dictBot.ListBot()
	return lst
}

// NewBot -- добавляет нового бота на ферму
func (sf *ServBots) NewBot(login, pass string) error {
	{ // Существует ли такой бот
		bot := sf.dictBot.Get(login)
		if bot != nil {
			return nil
		}
	}
	{ // Нет такого бота, надо его создать
		bot, err := warbot.НовВарБот(sf.server, login, pass)
		if err != nil {
			return fmt.Errorf("ServBots.NewBot(): in create bot %q, err=\n\t%w", login, err)
		}
		sf.dictBot.Add(bot)
	}
	return nil
}
