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

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

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

// Fuel -- топливо в баке
type Fuel struct {
	server types.IServer
	angar  types.IAngar
	bot    types.IServBot
	fuel   types.IStatParam
}

// NewFuel -- возвращает новый топливный бак
func NewFuel(server types.IServer, bot types.IServBot) (*Fuel, error) {
	{ // Предусловия
		if server == nil {
			return nil, fmt.Errorf("NewFuel(): IServer == nil")
		}
		if bot == nil {
			return nil, fmt.Errorf("NewFuel(): IServBot == nil")
		}
	}
	sf := &Fuel{
		server: server,
		angar:  bot.Angar(),
		bot:    bot,
		fuel:   static_param.NewStaticParam("fuel"),
	}
	return sf, nil
}

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

// Ищет в теле текста ангара топливо
func (sf *Fuel) findFuel() {
	// _mt.Println("\tAngarNet.findFuel()")
	if sf.fuel.Get() > 314 {
		return
	}
	lstAngar := sf.bot.Angar().GetLst()
	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"/> `)
	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.bot.Angar().Fuel().Set(iFuel)
	if iFuel <= 314 { // Минимальное значение "топливного склада-1" -- 315
		return
	}
	// log._rintf("Fuel.findFuel():iFuel=%v\n", iFuel)
}

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