// package battle -- объект сражения
package battle

import (
	"time"
	"wartank/pkg/arena"
	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/angar/battle/battle_register"
	"wartank/server/serv_bots/warbot/angar/battle/battle_wait"
	"wartank/server/serv_bots/warbot/angar/battle/battle_worker"
)

// Сражение -- объект сражения
type Сражение struct {
	types.ИАрена
	бот    types.ИБот
	клиент types.ИХттпВоркер

	регистрация *battle_register.СхваткаРегистрация // Регистратор на сражение
	ожидание    *battle_wait.СхваткаОжидание        // Ожидатель начала сражения
	действие    *battle_worker.СхваткаИсполнитель   // Исполнитель сражения

}

// НовСражение -- возвращает новый *Battle
func НовСражение(бот types.ИБот) *Сражение {
	сам := &Сражение{
		бот:    бот,
		клиент: бот.Сеть().ВебВоркер(),
	}
	аренаКонфиг := arena.АренаКонфиг{
		Бот_:         бот,
		АренаИмя_:    "Группа сражения",
		СтрКонтроль_: "<span>до начала ",
		ФнПуск_:      сам.пуск,
		СтрУрл_:      "https://wartank.ru/battle",
	}
	сам.ИАрена = arena.НовАрена(аренаКонфиг)
	сам.регистрация = battle_register.НовСражениеРегистрация(бот)
	сам.ожидание = battle_wait.НовСражениеОжидание(бот)
	сам.действие = battle_worker.НовСражениеИсполнитель(бот)

	// сам.shotTimeFull.Set(8000) // 8000 msec
	return сам
}

func (сам *Сражение) Пуск() {
	go сам.пуск()
}

// запускает в работу сражение
func (сам *Сражение) пуск() {
	for {
		select {
		case <-сам.бот.Контекст().Done():
			return
		default:
			сам.регистрация.Зарегистрироваться()
			сам.ожидание.Ожидать()
			сам.действие.Пуск()
			time.Sleep(time.Second * 2) // Пауза между циклами, чтобы сервер не долбить запросами
		}
	}
}

// ЕслиНачало -- возвращает признак начала сражения (для браузера)
func (сам *Сражение) ЕслиНачало() types.ИСтатПарам {
	return сам.действие.Тревога()
}
