package market

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

	"wartank/pkg/components/section"
	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/angar/base/market/marketnet"
)

/*
	Объект рынка
*/

// Рынок -- объект рынка
type Рынок struct {
	*section.Section
	бот  types.ИБот
	сеть *marketnet.MarketNet
}

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

// Пуск -- запускает всю работу рынка в отдельном потоке
func (сам *Рынок) Пуск() error {
	go сам.пуск()
	return nil
}

// выполняет опрос рынка базы, должен работать как горутина
func (сам *Рынок) пуск() {
	time.Sleep(time.Second * 25)
	for {
		select {
		case <-сам.бот.Кнт().Done():
			сам.ВремяОпрос().Стоп()
			return
		case <-сам.ВремяОпрос().КаналСиг():
			log.Printf("Market.run(): timeCount=%v\n", сам.ВремяОпрос().Получ())
			_ = сам.купитьЗолото()
			// Если золото не куплено -- обновить время ожидания
			сам.SetCountDown(120)
		}
		сам.проверОжидание()
		for сам.купитьЗолото() {

		}
		time.Sleep(time.Minute * 10)
	}
}

// Проверяет  время ожидания рынка
func (сам *Рынок) проверОжидание() {
	var (
		strOut string
		isFind bool
	)
	// countDown := sf.CountDown().Get()
	фнЕслиСеребро := func() bool { // Найти счётчик цены серебра
		if err := сам.сеть.UpdateLst(); err != nil { // Принудительное ПЕРВОЕ обновление рынка
			log.Printf("Market.checkTime(): при обновлении lstMarket, err=\n\t%v\n", err)
			return false
		}
		isFind := false
		lstMarket := сам.СписПолучить()
		for _, strOut = range lstMarket {
			if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
				isFind = true
				break
			}
		}
		if isFind {
			lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
			strSilver := lstSilver[1]
			switch strSilver {
			case "10", "50", "100", "500":
				return true
			default:
				серебро := сам.бот.Ангар().СереброВсего()
				if серебро.Получ() > 1_000_000 {
					return true
				}
				return false
			}
		}
		return false
	}

	fnGetCountDown := func() { // Искать счётчик времени
		lstMarket := сам.СписПолучить()
		// Найти счётчик времени
		for _, strOut = range lstMarket {
			if strings.Contains(strOut, `Минимальная цена через `) {
				isFind = true
				break
			}
		}
		if !isFind {
			return // Минимальная цена
		}
		lstTime := strings.Split(strOut, `Минимальная цена через `)
		strTime := lstTime[1]
		if err := сам.ParseCountDown(strTime); err != nil {
			// log._rintf("ERRO Market.checkTime(): при установке времени ожидания рынка(%v)\n\terr=%v\n", strTime, err)
			return // Возможно минимальная цена
		}
	}
	if фнЕслиСеребро() {
		return
	}
	fnGetCountDown()
}

// Проверяет рынок на режим покупки
func (сам *Рынок) купитьЗолото() bool {
	var (
		ind       int
		isFind    bool
		strOut    string
		lstMarket = сам.СписПолучить()
		strSilver string
	)
	for ind, strOut = range lstMarket {
		if strings.Contains(strOut, `alt="Серебро" title="Серебро"> `) {
			isFind = true
			break
		}
	}
	if !isFind { // Не найдена продажа золота за серебро
		return false
	}
	lstSilver := strings.Split(strOut, `<img class="ico vm" src="/images/icons/silver.png?2" alt="Серебро" title="Серебро"> `)
	strSilver = lstSilver[1]
	серебро := сам.бот.Ангар().СереброВсего().Получ()
	еслиКупить := false
	switch strSilver {
	case "10", "50", "100", "500": // Допустимые суммы трат
		еслиКупить = true
	case "1000": // Если стоит тысяча серебра
		if серебро > 500_000 { // Если серебра больше полумиллона -- покупаем
			еслиКупить = true
		}
	case "5000", "10000": // Если большая сумма -- можно купить и больше
		if серебро > 1_000_000 {
			еслиКупить = true
		}
	}
	if !еслиКупить {
		return false
	}
	ind -= 15
	strOut = lstMarket[ind]
	lstLink := strings.Split(strOut, `<a class="simple-but border mb5" href="`)
	if len(lstLink) < 2 {
		return false
	}
	strLink := lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Получить `)
	strLink = "https://wartank.ru/" + lstLink[0]
	lstMarket, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Market.buyGold(): при выполнении GET-команды на покупку золота, err=\n\t%v\n", err)
		return true
	}
	for _, strOut = range lstMarket {
		if strings.Contains(strOut, `Ошибка на сервере. Сообщение админу уже отправлено.`) {
			// log._rintf("ERRO Market.buyGold(): при получении lstMarket, strHTML=%v, err=\nt%v\n", strOut, err)
			return false
		}
	}
	if err = сам.СтрОбновить(lstMarket); err != nil {
		// log._rintf("Market.buyGold(): при обновлении lstMarket, err=\n\t%v\n", err)
		return true
	}
	return true
}
