// package battle_worker -- исполнение битвы
package battle_worker

import (
	"fmt"
	"time"

	"wartank/pkg/components/section"
	"wartank/pkg/components/sectionnet"
	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon"
	"wartank/server/serv_bots/warbot/angar/battle/battle_worker/battleon/battlesound"
	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
)

// BattleWorker -- исполнение битвы
type BattleWorker struct {
	*section.Section
	server types.IServer
	bot    types.IServBot
	net    *sectionnet.SectionNet

	alarm types.IStatParam

	// Непосредственное сражение
	baton *battleon.BattleOn

	sound *battlesound.BattleSound // Однопоточное проигрывание звука
}

// NewBattleWorker -- возвращает новый исполнитель битвы
func NewBattleWorker(server types.IServer, bot types.IServBot) (*BattleWorker, error) {
	{ // Предусловия
		if server == nil {
			return nil, fmt.Errorf("NewBattleWorker(): IServer == nil")
		}
		if bot == nil {
			return nil, fmt.Errorf("NewBattleWorker():IServBot == nil")
		}
	}
	sf := &BattleWorker{
		server: server,
		bot:    bot,
		alarm:  static_param.NewStaticParam("alarm"),
		sound:  battlesound.NewBattleSound(),
	}
	var err error
	{ // ISection (ожидание)
		sf.Section, err = section.NewSection(server, `<title>Сражения</title>`)
		if err != nil {
			return nil, fmt.Errorf("NewBattleWorker(): in create *Section, err=\n\t%w", err)
		}
	}
	return sf, nil
}

// Run -- запускает ожидание в работу
func (sf *BattleWorker) Run() {
	sf.net = sectionnet.NewSectionNet(sf.server, sf.bot, sf, "http://wartank.ru/pve")
}

// Work -- выполняет битву
func (sf *BattleWorker) Work() {
	var err error
	sf.baton, err = battleon.NewBattleOn(sf.server, sf.bot) // IBattleOn (онлайн)
	if err != nil {
		return
	}
	sf.alarm.Set(1)
	sf.sound.Play()
	time.Sleep(time.Second * 10) // Задержка для звука на странице
	sf.alarm.Set(0)
	// Ожидание завершения
	<-sf.baton.Ctx().Done()
	sf.baton = nil
	sf.CountDown().Set(2)
	// log._rintf("Battle.runBaton(): сражение завершено\n")
}

// Alarm -- возвращает признак начала сражения (для браузера)
func (sf *BattleWorker) Alarm() types.IStatParam {
	return sf.alarm
}
