// package battle_register -- регестрирует танк в битве
package battle_register

import (
	"fmt"
	"log"
	"strings"

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

// BattleRegister -- регистрирует танк к началу атаки
type BattleRegister struct {
	*section.Section
	server types.IServer
	bot    types.IServBot
	net    *sectionnet.SectionNet
}

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

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

// Register -- регистрирует танк на сражение
func (sf *BattleRegister) Register() {
	if err := sf.net.UpdateLst("Ближайшее сражение"); err != nil { // Здесь может уже обратный отсчёт перед сражением
		return
	}
	var (
		strOut    string
		lstBattle = sf.GetLst()
		isFind    bool
	)
	for _, strOut = range lstBattle {
		if strings.Contains(strOut, `>Взвод, подъем! В атаку!<`) {
			isFind = true
			break
		}
		if strings.Contains(strOut, `<div class="white medium cntr bold mb5">Вы в рядах участников</div>`) {
			// log._rintf("INFO BattleRegister.Register(): уже зарегистрирован\n")
			return
		}
	}
	if !isFind { // Возможно, ожидание или битва уже идёт
		return
	}
	// Найдено приглашение на участие
	lstUp := strings.Split(strOut, `<a class="simple-but border" href="`)
	linkUp := lstUp[1]
	lstUp = strings.Split(linkUp, `"><span><span>Взвод, подъем! В атаку!</span></span></a>`)
	linkUp = "http://wartank.ru/" + lstUp[0]
	lstBattle, err := sf.net.Get(linkUp)
	if err != nil {
		// log._rintf("ERRO BattleRegister.Register(): при выполнении GET-команды на подъём в атаку, err=\n\t%v\n", err)
		return
	}
	if err = sf.Update(lstBattle); err != nil {
		log.Printf("BattleRegister.Register(): при обновлении lstBattle, err=\n\t%v\n", err)
	}
	// log._rintf("INFO BattleRegister.Register(): регистрация прошла успешно\n")
}
