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

import (
	"fmt"
	"wartank/pkg/alias"
	"wartank/pkg/types"
	"wartank/server/serv_bots/dict_warbot"
	"wartank/server/serv_bots/warbot"
)

// БотоФерма -- словарь ботов на сервере
type БотоФерма struct {
	серв    types.ИСервер
	хран    types.ИХранилище
	словБот *dict_warbot.СловарьБотов
}

// НовБотоФерма -- возвращает новый словарь серверных ботов
func НовБотоФерма(серв types.ИСервер) *БотоФерма {
	лог := серв.Слог()
	лог.Инфо("НовБотоФерма()\n")
	лог.Паника(серв == nil, "НовБотоФерма(): ИСервер == nil")
	сам := &БотоФерма{
		серв: серв,
		хран: серв.Хранилище(),
	}
	сам.словБот = dict_warbot.НовСловарьБотов(серв)
	return сам
}

// Get -- возвращает боевого бота по имени
func (сам *БотоФерма) Get(botNumber alias.БотНомер) types.ИБот {
	bot := сам.словБот.Get(botNumber)
	return bot
}

// BotStart -- запускает бота в работу по его имени
func (сам *БотоФерма) BotStart(botNumber alias.БотНомер) error {
	bot := сам.словБот.Get(botNumber)
	if bot == nil {
		return fmt.Errorf("ServBots.BotStart(): bot(%v) not found", botNumber)
	}
	bot.Пуск()
	return nil
}

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

// НовБот -- добавляет нового бота на ферму
func (сам *БотоФерма) НовБот(логин, пароль string, еслиАвто bool) error {
	{ // Существует ли такой бот
		for _, бот := range сам.словБот.ListBot() {
			if бот.Имя() == логин {
				return nil
			}
		}
	}
	номер := alias.БотНомер(len(сам.словБот.ListBot()) + 1)
	фнНомерПровер := func() bool {
		for _, бот := range сам.словБот.ListBot() {
			if бот.Номер() == номер {
				return false
			}
		}
		return true
	}
	for !фнНомерПровер() {
		номер++
	}
	{ // Нет такого бота, надо его создать
		bot, err := warbot.НовВарБот(сам.серв, номер, логин, пароль, еслиАвто)
		if err != nil {
			return fmt.Errorf("БотоФерма.НовБот(): in create bot %q, err=\n\t%w", логин, err)
		}
		сам.словБот.Add(bot)
	}
	return nil
}
