// package fuel -- топливо в баке
package fuel

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

	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/tank/tankstat/static_param"
)

// Топливо -- топливо в баке
type Топливо struct {
	ангар   types.ИАнгар
	топливо types.ИСтатПарам
}

// НовТопливо -- возвращает новый топливный бак
func НовТопливо(ангар types.ИАнгар) (*Топливо, error) {
	if ангар == nil {
		return nil, fmt.Errorf("NewFuel(): IAngar == nil")
	}
	топливо, ош := static_param.НовСтатПарам("fuel")
	if ош != nil {
		return nil, fmt.Errorf("NewFuel(): при создании стат топливо, ош=\n\t%w", ош)
	}
	sf := &Топливо{
		ангар:   ангар,
		топливо: топливо,
	}
	return sf, nil
}

// Run -- должен работать в отдельном потоке, контролит топливо
func (sf *Топливо) Run() {
	count := 0 // Каждые 1500 сек (100 топлива проверять принудительно)
	for {
		time.Sleep(time.Second * 15)
		if sf.топливо.Получ() < 314 {
			sf.топливоНайти()
			count = 0
			continue
		}
		count++
		fuel := sf.топливо.Получ()
		fuel++
		sf.топливо.Уст(fuel)
		// log.Printf("Fuel.Run: val=%v\n", fuel)
	}
}

// Ищет в теле текста ангара топливо
func (sf *Топливо) топливоНайти() {
	// _mt.Println("\tAngarNet.findFuel()")
	lstAngar := sf.ангар.СписПолучить()
	var strOut string
	for _, strFuel := range lstAngar {
		if strings.Contains(strFuel, `<img title="Топливо" `) {
			strOut = strFuel
			break
		}
	}
	// Выделить топливо
	lstFuel := strings.Split(strOut, `<img title="Топливо" alt="Топливо" src="/images/icons/fuel.png?2"/> `)
	// Здесь бывает ошибка (когда возвращена пустая строка)
	if len(lstFuel) != 2 {
		log.Printf("ERRO Топливо.топливоНайти(): при поиске строки тплива, стр=\n\t%v\n", strOut)
		return
	}
	if lstFuel[1] == "" {
		log.Printf("ERRO Топливо.топливоНайти(): пустое значение в строке тплива, стр=\n\t%v\n", strOut)
		return
	}
	strFuel := lstFuel[1]
	iFuel, err := strconv.Atoi(strFuel)
	if err != nil {
		// log._rintf("ERRO Fuel.findFuel(): fuel(%v) not number, err=\n\t%v\n", strFuel, err)
		return
	}
	sf.топливо.Уст(iFuel)
	if iFuel <= 314 { // Минимальное значение "топливного склада-1" -- 315
		return
	}
	// log._rintf("Fuel.findFuel():iFuel=%v\n", iFuel)
}

// Fuel -- возвращает объект сстатическог опараметра топлива
func (sf *Топливо) Fuel() types.ИСтатПарам {
	return sf.топливо
}
