package missions

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

	"wartank/pkg/components/section"
	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/angar/missions/missionsnet"
)

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

// Миссии -- забирает золотишко
type Миссии struct {
	*section.Section
	бот  types.ИБот
	сеть *missionsnet.MissionsNet
}

// НовМиссии -- возвращает новый *Миссии
func НовМиссии(бот types.ИБот) (*Миссии, error) {
	section, err := section.NewSection(бот, "Миссии", `<title>Миссии</title>`)
	if err != nil {
		return nil, fmt.Errorf("НовМиссии(): in create *Section, err=\n\t%w", err)
	}
	сам := &Миссии{
		Section: section,
		бот:     бот,
	}
	сам.сеть, err = missionsnet.NewMissionsNet(сам)
	if err != nil {
		return nil, fmt.Errorf("НовМиссии(): in create *SectionNet, err=\n\t%w", err)
	}
	return сам, nil
}

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

// обрабатывает конвой
func (sf *Миссии) пуск() {
	defer func() {
		sf.ВремяОпрос().Стоп()
	}()
	time.Sleep(time.Second * 5)
	for { // Время истекло
		select {
		case <-sf.бот.Кнт().Done():
			sf.ВремяОпрос().Стоп()
			return
		case <-sf.ВремяОпрос().КаналСиг():
		// if err := sf.сеть.UpdateLst(); err != nil {
		// 	// log._rintf("ERRO Миссии.run(): при обновлении lstMissions, err=\n\t%v\n", err)
		// 	return
		// }
		// sf.проверНаграда()
		default:
			sf.проверНаграда()
			time.Sleep(time.Minute * 1)
		}

	}
}

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

// Проверяет награду за уничтожить 3 танка в бою
func (sf *Миссии) kill3tanks() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Уничтожь в бою 3 танка<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.kill3tanks(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.kill3tanks(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду оборонительного сражения
func (sf *Миссии) сражениеЗащита() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Проведи одно оборонительное сражение<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battleDefence(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battleDefence(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за одну войну
func (sf *Миссии) проведиВойну() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Проведи одну войну<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battleWar(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battleWar(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду наступательного сражения
func (сам *Миссии) сражениеНаступление() {
	var (
		strOut      string
		isFind      bool
		ind         int
		lstMissions = сам.СписПолучить()
	)
	if len(lstMissions) == 0 {
		if ош := сам.сеть.UpdateLst(); ош != nil {
			log.Printf("Миссии.сражениеНаступление(): при обновлении HTML миссий, ош=\n\t%v\n", ош)
			return
		}
		lstMissions = сам.СписПолучить()
	}
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, "Проведи одно наступательное сражение<br/>") {
			isFind = true
			break
		}
	}
	if !isFind {
		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 (sf *Миссии) battleDogFyting() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Проведи одну схватку<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battleDogFyting(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battleDogFyting(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за ресурсы
func (sf *Миссии) makeResource() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Произведи на базе 10 ресурсов<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.makeResource(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.makeResource(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за ресурсы
func (sf *Миссии) upMan() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Прокачай экипаж на 100 опыта экипажа<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.upMan(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.upMan(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
	// log._rintf("INFO Миссии.upMan(): награда получена\n")
}

// Проверяет награду за топливо
func (sf *Миссии) топливоДив() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Получи топливо в дивизии<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.makeFuel(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.makeFuel(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
	// log._rintf("INFO Миссии.makeFuel(): награда получена")
}

// Проверяет награду 5 боёв
func (sf *Миссии) battle5Fiting() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Проведи 5 боев<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battle5Fiting(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battle5Fiting(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду 10 боёв
func (sf *Миссии) battle10Fiting() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Уничтожь в бою 10 танков<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battle10Fiting(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battle10Fiting(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}

// Проверяет награду за 6 побед подряд
func (sf *Миссии) battle6win() {
	var (
		strOut      string
		lstMissions = sf.СписПолучить()
		isFind      bool
		ind         int
	)
	for ind, strOut = range lstMissions {
		if strings.Contains(strOut, `Победи 6 раз подряд<br/>`) {
			isFind = true
			break
		}
	}
	if !isFind {
		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 := sf.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Миссии.battle6win(): при выполнении GET-запроса, err=\n\t%v\n", err)
		return
	}
	if err := sf.СтрОбновить(lstMissions); err != nil {
		// log._rintf("ERRO Миссии.battle6win(): при обновлении lstMissions, err=\n\t%v\n", err)
		return
	}
}
