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

import (
	"fmt"
	"net/http"
	"time"

	"wartank/pkg/components/section"
	"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 {
	*section.Section
	бот    types.ИБот
	клиент *http.Client

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

}

// НовСражение -- возвращает новый *Battle
func НовСражение(бот types.ИБот) (*Сражение, error) {
	section, err := section.NewSection(бот, "Группа сражения", `<span>до начала `)
	if err != nil {
		return nil, fmt.Errorf("НовСражение(): in create *Section, err=\n\t%w", err)
	}

	sf := &Сражение{
		Section: section,
		бот:     бот,
		клиент:  бот.Сеть().Коннект(),
	}
	{
		sf.регистрация, err = battle_register.NewBattleRegister(бот)
		if err != nil {
			return nil, fmt.Errorf("НовСражение(): при создании регистратора на сражения, err=\n\t%w", err)
		}
		sf.ожидание, err = battle_wait.НовСражениеОжидание(бот)
		if err != nil {
			return nil, fmt.Errorf("НовСражение(): при создании ожидателя сражения, err=\n\t%w", err)
		}
		sf.действие, err = battle_worker.НовСражениеИсполнитель(бот)
		if err != nil {
			return nil, fmt.Errorf("НовСражение(): при создании исполнителя сражения, err=\n\t%w", err)
		}
	}
	// sf.shotTimeFull.Set(8000) // 8000 msec
	return sf, nil
}

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

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

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