// package tank_params -- параметры танка повышение
package tank_params

import (
	"fmt"
	"log"
	"strconv"
	"strings"
	"time"
	"wartank/pkg/types"
)

// ТанкПараметры -- параметры танка повышение
type ТанкПараметры struct {
	бот   types.ИБот
	номер string // Номер танка в игре
}

// НовТанкПараметры -- возвращает новые параметры танка
func НовТанкПараметры(бот types.ИБот) (*ТанкПараметры, error) {
	if бот == nil {
		return nil, fmt.Errorf("НовТанкПараметры(): ИБот == nil")
	}
	сам := &ТанкПараметры{
		бот: бот,
	}
	return сам, nil
}

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

// Запускает в работу в отдельном потоке
func (сам *ТанкПараметры) пуск() {
	time.Sleep(time.Second * 4)
	ош := сам.номерПолуч()
	if ош != nil {
		log.Printf("ТанкПараметры.пуск(): при получении параметров танка, ош=\n\t%v\n", ош)
		сам.бот.Сервер().Отменить()
		return
	}
	for {
		select {
		case <-сам.бот.Контекст().Done():
			return
		default:
			сам.работать()
		}
	}
}

// Основной метод работы
func (сам *ТанкПараметры) работать() {
	defer time.Sleep(time.Second * 300)
	if ош := сам.улучшить(); ош != nil {
		log.Printf("ТанкПараметры.работать(): ош=\n\t%v\n", ош)
		return
	}
}

// Улучшает параметры танка
func (сам *ТанкПараметры) улучшить() error {
	// https://wartank.ru/pimp/34479487
	клиент := сам.бот.Сеть().ВебВоркер()
	фнУлучшить := func() error {
		лстСтр := клиент.Получ("https://wartank.ru/pimp/" + сам.номер)
		var (
			стрВых    string
			еслиНашли bool
		)
		// <a class="simple-but border mb5" href="34479487?22-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link">
		for _, стрВых = range лстСтр {
			if strings.Contains(стрВых, `<a class="simple-but border mb5" href="`+сам.номер) {
				еслиНашли = true
				break
			}
		}
		if !еслиНашли {
			return fmt.Errorf("ТанкПараметры.улучшить(): не нашёл кнопку улучшения")
		}
		стрВых = strings.TrimPrefix(стрВых, `<a class="simple-but border mb5" href="`)
		стрВых = strings.TrimSuffix(стрВых, `">`)
		// https://wartank.ru/pimp/34479487?21-1.ILinkListener-modules-slots-0-slot-root-pimpLink-link
		стрСсылка := "https://wartank.ru/pimp/" + стрВых
		_ = клиент.Получ(стрСсылка)
		return nil
	}
	счётОш := 5
	for счётОш > 0 {
		ош := фнУлучшить()
		if ош == nil {
			return nil
		}
		log.Printf("ТанкПараметры.улучшить(): ош=\n\t%v\n", ош)
		счётОш--
		time.Sleep(time.Millisecond * 350)
	}
	return nil
}

// Получает собственный номер танка с сервера
func (сам *ТанкПараметры) номерПолуч() error {
	клиент := сам.бот.Сеть().ВебВоркер()
	лстСтр := клиент.Получ("https://wartank.ru/angar")
	var (
		стрНомер  string
		еслиНашёл bool
	)
	// https://wartank.ru/power/34479487
	for _, стрНомер = range лстСтр {
		if strings.Contains(стрНомер, `href="power/`) {
			еслиНашёл = true
			break
		}
	}
	if !еслиНашёл {
		return fmt.Errorf("ТанкПараметры.номерПолуч(): не нашёл собственный номер на сервере")
	}
	стрВыход := strings.TrimPrefix(стрНомер, `<a class="simple-but border" href="power/`)
	стрВыход = strings.TrimSuffix(стрВыход, `"><span><span>Повысить параметры</span></span></a>`)
	_, ош := strconv.Atoi(стрВыход)
	if ош != nil {
		return fmt.Errorf("ТанкПараметры.номерПолуч(): ошибка преобразования собственного номера(%s), ош=\n\t%w", стрВыход, ош)
	}
	сам.номер = стрВыход
	return nil
}
