package shottime

import (
	"sync"

	"github.com/sirupsen/logrus"

	"wartank/pkg/alias"
)

/*
	Содержит время до выстрела
*/

// ShotTime -- время до выстрела
type ShotTime struct {
	val   alias.AMilSec // Время в мсек
	block sync.RWMutex
}

// NewShotTime -- возвращает новый ShotTime
func NewShotTime() *ShotTime {
	return &ShotTime{}
}

// Get -- возвращает хранимое время до выстрела
func (sf *ShotTime) Get() alias.AMilSec {
	sf.block.RLock()
	defer sf.block.RUnlock()
	return sf.val
}

// Dec5 -- уменьшает время до выстрела на 5 мсек
func (sf *ShotTime) Dec5() {
	sf.block.Lock()
	defer sf.block.Unlock()
	sf.val -= 5
	if sf.val < 0 {
		sf.val = 0
	}
}

// Dec30 -- уменьшает время до выстрела на 30 мсек
func (sf *ShotTime) Dec30() {
	sf.block.Lock()
	defer sf.block.Unlock()
	sf.val -= 30
	if sf.val < 0 {
		sf.val = 0
	}
}

// Inc210 -- увеличивает время до выстрела на 210 мсек
func (sf *ShotTime) Inc210() {
	sf.block.Lock()
	defer sf.block.Unlock()
	sf.val += 210
}

// IsZero -- возвращает истину, если значение обнулено
func (sf *ShotTime) IsZero() bool {
	sf.block.RLock()
	defer sf.block.RUnlock()
	return sf.val == 0
}

// Set -- устанавливает значение по требованию
func (sf *ShotTime) Set(val alias.AMilSec) {
	sf.block.Lock()
	defer sf.block.Unlock()
	if val < 0 {
		logrus.WithField("val", val).Error("ShotTime.Set(): отрицательное значение")
		return
	}
	sf.val = val
}
