// 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
	бот types.ИБот
	net *sectionnet.SectionNet

	еслиНачало types.ИСтатПарам

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

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

// NewBattleWorker -- возвращает новый исполнитель битвы
func NewBattleWorker(bot types.ИБот) (*BattleWorker, error) {
	section, err := section.NewSection(bot, "Ход сражения", `<title>Сражения</title>`)
	if err != nil {
		return nil, fmt.Errorf("NewBattleWorker(): in create *Section, err=\n\t%w", err)
	}
	еслиНачало, ош := static_param.НовСтатПарам("alarm")
	if ош != nil {
		return nil, fmt.Errorf("NewBattleWorker(): при создании стат еслиНачало, err=\n\t%w", ош)
	}
	sf := &BattleWorker{
		Section:    section,
		бот:        bot,
		еслиНачало: еслиНачало,
		sound:      battlesound.NewBattleSound(),
	}
	sf.net, err = sectionnet.NewSectionNet(sf, "http://wartank.ru/pve")
	if err != nil {
		return nil, fmt.Errorf("NewBattleWorker(): in create *SectionNet, err=\n\t%w", err)
	}
	return sf, nil
}

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

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