// package battle_wait -- заставляет ожидать начало битвы
package battle_wait

import (
	"fmt"
	// "log"
	"strings"
	"time"

	"wartank/pkg/components/section"
	"wartank/pkg/components/sectionnet"
	"wartank/pkg/types"
)

// BattleWait -- ожидатель начала битвы
type BattleWait struct {
	*section.Section
	server types.IServer
	bot    types.IServBot
	net    *sectionnet.SectionNet
}

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

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

// Wait -- ожидает начало сражения
func (sf *BattleWait) Wait() {
	if err := sf.net.UpdateLst("Ближайшее сражение"); err != nil { // Здесь может уже обратный отсчёт перед сражением
		return
	}
	var (
		strOut    string
		lstBattle = sf.GetLst()
		isFind    bool
	)
	for _, strOut = range lstBattle {
		if strings.Contains(strOut, `<span>до начала `) {
			isFind = true
			break
		}
		// if strings.Contains(strOut, `>ОБЫЧНЫЕ<`) { // Это уже битва
		// 	if len(sf.chBattle) == 0 {
		// 		sf.chBattle <- 1
		// 	}
		// 	return
		// }
	}
	if !isFind { // Сражение уже идёт
		return
	}
	// Найдена строка ожидания начала сражения
	lstTime := strings.Split(strOut, `<span>до начала `)
	strTime := lstTime[1]
	lstTime = strings.Split(strTime, ` (`)
	strTime = lstTime[0]
	if err := sf.CountDown().Parse(strTime); err != nil {
		// log._rintf("WARN BattleWait.Wait(): при установке времени ожидания сражения(%v)\n\terr=%v\n", strTime, err)
		return
	}
	// Зайти в цикложидания сражения
	for {
		countTime := sf.CountDown().Get()
		if countTime > 0 {
			time.Sleep(time.Millisecond * 500)
			// log.Printf("BattleWait.Wait(): countTime=%v\n", sf.CountDown().String())
			continue
		}
		for len(sf.CountDown().ChanSig()) > 0 {
			<-sf.CountDown().ChanSig()
		}
		return
	}
}
