package masters

import (
	"log"
	"strings"
	"time"
	"wartank/pkg/alias"
	"wartank/pkg/arena"
	"wartank/pkg/components/arena_net"
	"wartank/pkg/components/kernel/logger"
	"wartank/pkg/types"
)

/*
	Битва мастеров. Работает примерно раз в сутки.
	Требуется три победы, потом нужно загрести золотишко.
	Между битвами надо удерживать рейтинг, чтобы не кидало к монстрам.
*/

// БитваМастеров -- объект битвы мастеров
type БитваМастеров struct {
	types.ИАрена
	бот  types.ИБот
	сеть types.ИАренаСеть
	лог  types.ИЛоггер
}

// НовБитваМастеров -- возвращает новый *BatMas
func НовБитваМастеров(бот types.ИБот) *БитваМастеров {
	лог := logger.НовЛоггер("БитваМастеров")
	лог.Инфо("НовБитваМастеров()\n")
	лог.Паника(бот == nil, "НовБитваМастеров(): ИБот == nil\n")
	сам := &БитваМастеров{
		бот: бот,
		лог: лог,
	}
	аренаКонфиг := arena.АренаКонфиг{
		Бот_:         бот,
		АренаИмя_:    "Битва мастеров",
		СтрКонтроль_: `/> Битва мастеров <`,
		ФнПуск_:      сам.пуск,
		СтрУрл_:      "https://wartank.ru/pvp",
	}
	сам.ИАрена = arena.НовАрена(аренаКонфиг)
	сам.сеть = arena_net.НовАренаСеть(сам, "https://wartank.ru/pvp")
	return сам
}

// запускает в работу битву мастеров
func (сам *БитваМастеров) пуск() {
	_ = сам.goBatMas()
	go func() {
		for {
			time.Sleep(time.Second * 10)
			select {
			case <-сам.бот.Контекст().Done():
				return
			case <-сам.ВремяОстат().КаналСиг():
				if !сам.goBatMas() { // Проверка на начало сражения
					continue
				}
			}
		}
	}()
}

// Вычисляет нужно ли идти в битву мастеров
//
//	если нужно, то время проверять уже не надо
func (сам *БитваМастеров) goBatMas() bool {
	сам.findTimeCount()
	if !сам.upBattle() {
		return false
	}
	countTime := сам.ВремяОстат().String()
	if countTime > "00:25:00" {
		if err := сам.ОбратВремяУст(alias.Время(countTime)); err != nil {
			сам.лог.Ошибка("goBatMas(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", countTime, err)
		}
		return false
	}

	// Время меньше 25 сек, надо уточнять (тут возможна ошибка с экраном ожидания)
	сам.сеть.Обновить()
	// Время ожидания вышло, надо начать атаку
	if err := сам.ОбратВремяУст("00"); err != nil {
		log.Printf("ERRO BatMas.goBatMas(): при установке времени ожидания битвы мастеров(0)\n\terr=%v\n", err)
	}
	return false
}

// Ищет время до начала битвы мастеров
func (сам *БитваМастеров) findTimeCount() {
	var (
		strOut      string
		lstBattle   = сам.СписПолучить()
		еслиНайдено bool
	)
	// Обновление через: 12:02:22
	for _, strOut = range lstBattle {
		if strings.Contains(strOut, `Обновление через: `) {
			еслиНайдено = true
			break
		}
	}
	if еслиНайдено { // Ждём начала битвы мастеров
		lstTime := strings.Split(strOut, `Обновление через: `)
		strTime := lstTime[1]
		lstTime = strings.Split(strTime, ` (`)
		strTime = lstTime[0]

		if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
			log.Printf("WARN BatMas.findTimeCount(): при установке времени ожидания битвы мастеров(%v)\n\terr=%v\n", strTime, err)
		}
	}
}

// При необходимости даёт команду на участие в битве мастеров,
//
//	вызывается только если есть награда
func (сам *БитваМастеров) upBattle() bool {
	сам.сеть.Обновить()
	// log.Error("BatMas.upBattle(): доделать")
	// var (
	// 	strOut    string
	// 	lstBattle = сам.GetLst()
	// 	еслиНайдено    bool
	// )
	// for _, strOut = range lstBattle {
	// 	if strings.Contains(strOut, `>Взвод, подъем! В атаку!<`) {
	// 		еслиНайдено = true
	// 		break
	// 	}
	// }
	// if еслиНайдено {
	// 	lstUp := strings.Split(strOut, `<a class="simple-but border" href="`)
	// 	linkUp := lstUp[1]
	// 	lstUp = strings.Split(linkUp, `"><span><span>Взвод, подъем! В атаку!</span></span></a>`)
	// 	linkUp = "https://wartank.ru/" + lstUp[0]
	// 	lstBattle, err := сам.net.Get(linkUp)
	// 	if err != nil {
	// 		log.WithError(err).Error("Battle.upBattle(): при выполнении GET-команды на подъём в атаку")
	// 		return false
	// 	}
	// 	if err = сам.Update(lstBattle); err != nil {
	// 		log.WithError(err).Error("Battle.upBattle(): при обновлении lstBattle")
	// 	}
	// }
	return false
}
