package health

import (
	"fmt"
	"strings"
	"time"

	"wartank/pkg/types"
)

/*
	Контролирует состояние здоровья танка
*/

// Здоровье -- контроль здоровья танка
type Здоровье struct {
	types.ИСражениеДействие
	канТик     chan int // Канал для ровной отправки тиков
	счётЛечить int      // Счётчик вызовов лечения
}

// НовЗдоровье -- возвращает новый *Здоровье
func НовЗдоровье(действие types.ИСражениеДействие) (*Здоровье, error) {
	{ // Предусловия
		if действие == nil {
			return nil, fmt.Errorf("НовЗдоровье(): действие==nil")
		}
	}
	sf := &Здоровье{
		ИСражениеДействие: действие,
		канТик:            make(chan int, 2),
	}
	go sf.makeTik()
	go sf.пуск()
	return sf, nil
}

// Отправляе ттики с заданным равным интервалом
func (сам *Здоровье) makeTik() {
	defer func() {
		close(сам.канТик)
		сам.Отменить()
		// log._rintf("Здоровье.makeTick(): сражение завершёно\n")
	}()
	for {
		select {
		case <-сам.Кнт().Done():
			return
		default:
			сам.канТик <- 1
			time.Sleep(time.Second * 10)
		}
	}
}

// Главный цикл обработки здоровья в сражении
func (сам *Здоровье) пуск() {
	defer func() {
		сам.Отменить()
	}()
	for range сам.канТик {
		сам.лечить()
	}
}

// Полное -- возвращает объект полного здоровья танка
func (сам *Здоровье) Полное() int {
	return 0
}

// ЕслиМёртвый -- возвращает признак мертвичины танка
func (сам *Здоровье) ЕслиМёртвый() bool {
	lstBattle := сам.СписПолучить()
	for _, strOut := range lstBattle {
		if strings.Contains(strOut, `>Ваш танк подбит.`) {
			// log._rintf("INFO Здоровье.repair(): танк подбит\n")
			сам.Отменить()
			return true
		}
	}
	return false
}

// Восстановливает здоровье (~)
func (сам *Здоровье) лечить() {

	// <span>Ремкомплект</span>
	// <a href="pve?19-14.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>Ремкомплект</span></span></a>

	strLink := "https://wartank.ru/pve?19-{count}.ILinkListener-currentControl-repairLink"
	// <a href="pve?6-26.ILinkListener-currentControl-repairLink" class="simple-but blue"><span><span>Ремкомплект</span></span></a>
	strLink = strings.ReplaceAll(strLink, "{count}", fmt.Sprint(сам.счётЛечить))
	lstBattleOn, err := сам.Сеть().Get(strLink)
	if err != nil {
		// log._rintf("ERRO Здоровье.repair(): при выполнении GET-команды ремонта, err=\n\t%v\n", err)
		return
	}
	if err = сам.СтрОбновить(lstBattleOn); err != nil {
		// log._rintf("ERRO Здоровье.repair(): при обновлении lstBattle, err=\n\t%v\n", err)
		return
	}
}
