package missions

import (
	"strings"
	"time"
	"wartank/pkg/arena"
	"wartank/pkg/components/arena_net"
	"wartank/pkg/types"
)

/*
	Сканирует миссии на предмет забрать золотишко.
*/

// Миссии -- забирает золотишко
type Миссии struct {
	types.ИАрена
	бот  types.ИБот
	сеть types.ИАренаСеть
}

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

// // Бот -- возвращает бота
// func (сам *Миссии) Бот() types.ИБот {
// 	return сам.бот
// }

// Пуск -- запускает в работу сбор миссий
func (сам *Миссии) Пуск() {
	go сам.пуск()
}

// обрабатывает конвой
func (сам *Миссии) пуск() {
	time.Sleep(time.Second * 5)
	for { // Время истекло
		// time.Sleep(time.Minute * 1)
		select {
		case <-сам.бот.Контекст().Done():
			return
		default:
			сам.проверНаграда()
			time.Sleep(time.Minute * 1)
		}
	}
}

// Забирает всё самое вкусное
func (сам *Миссии) проверНаграда() {
	сам.сражениеЗащита()
	сам.сражениеНаступление()
	сам.проведиВойну()
	сам.battle5Fiting()
	сам.battle6win()
	сам.battle10Fiting()
	сам.battleDogFyting()
	сам.makeResource()
	сам.kill3tanks()
	сам.топливоДив()
	сам.upMan()
}

// Проверяет награду за уничтожить 3 танка в бою
func (сам *Миссии) kill3tanks() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Уничтожь в бою 3 танка<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.kill3tanks(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.kill3tanks(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду оборонительного сражения
func (сам *Миссии) сражениеЗащита() {
	var (
		strOut      string
		еслиНайдено bool
	)
	сам.сеть.Обновить()
	списМиссия := сам.СписПолучить()
	// <a class="simple-but border" href="?23-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	for _, strOut = range списМиссия {
		if strings.Contains(strOut, `.ILinkListener-missions-cc-0-c-awardLink`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Получить награду</span></span></a>`)
	strLink := "https://wartank.ru/missions/" + _ссылка
	списМиссия, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battleDefence(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(списМиссия); err != nil {
		// log._rintf("ERRO Миссии.battleDefence(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за одну войну
func (сам *Миссии) проведиВойну() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Проведи одну войну<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battleWar(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battleWar(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду наступательного сражения
func (сам *Миссии) сражениеНаступление() {
	var (
		strOut      string
		еслиНайдено bool
		ind         int
		lstMissions = сам.СписПолучить()
	)
	if len(lstMissions) == 0 {
		сам.сеть.Обновить()
		lstMissions = сам.СписПолучить()
	}
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, "Проведи одно наступательное сражение<br/>") {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battleAttack(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battleAttack(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за схватку
func (сам *Миссии) battleDogFyting() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Проведи одну схватку<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battleDogFyting(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battleDogFyting(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за ресурсы
func (сам *Миссии) makeResource() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Произведи на базе 10 ресурсов<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.makeResource(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.makeResource(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за ресурсы
func (сам *Миссии) upMan() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Прокачай экипаж на 100 опыта экипажа<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?70-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.upMan(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.upMan(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
	// log._rintf("INFO Миссии.upMan(): награда получена\n")
}

// Проверяет награду за топливо
func (сам *Миссии) топливоДив() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Получи топливо в дивизии<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?157-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 19
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду</`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.makeFuel(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.makeFuel(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
	// log._rintf("INFO Миссии.makeFuel(): награда получена")
}

// Проверяет награду 5 боёв
func (сам *Миссии) battle5Fiting() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Проведи 5 боев<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?113-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battle5Fiting(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battle5Fiting(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду 10 боёв
func (сам *Миссии) battle10Fiting() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Уничтожь в бою 10 танков<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?113-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 23
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battle10Fiting(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battle10Fiting(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за 6 побед подряд
func (сам *Миссии) battle6win() {
	var (
		strOut      string
		lstMissions = сам.СписПолучить()
		еслиНайдено bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Победи 6 раз подряд<br/>`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return
	}
	// <a class="simple-but border" href="?113-1.ILinkListener-missions-cc-0-c-awardLink"><span><span>Получить награду</span></span></a>
	ind += 25
	strOut = lstMissions[ind]
	if !strings.Contains(strOut, `>Получить награду<`) {
		return
	}
	lstLink := strings.Split(strOut, `<a class="simple-but border" href="`)
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить награду</span></span></a>`)
	strLink = "https://wartank.ru/missions/" + lstLink[0]
	lstMissions, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battle6win(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := сам.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battle6win(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}
