package core

// IntervalTimer tracks elapsed time against a fixed interval and is useful
// for triggering recurring events such as animation frame updates, blinking
// effects, and periodic AI decisions.
//
// Unlike a countdown timer, an IntervalTimer accumulates time and signals
// when the interval has been reached.
type IntervalTimer struct {
	time     float32 // Elapsed time in seconds
	interval float32 // Interval threshold in seconds
}

// NewIntervalTimer creates a new Timer with the given interval duration.
func NewIntervalTimer(interval float32) IntervalTimer {
	return IntervalTimer{
		interval: interval,
	}
}

func (t *IntervalTimer) SetInterval(interval float32) {
	t.interval = interval
}

// Update advances the timer by dt (delta time in seconds).
// Returns true if the accumulated time has reached or exceeded the interval.
func (t *IntervalTimer) Update(dt float32) bool {
	t.time += dt
	return t.Ticked()
}

// Same as Update, but will also reset the timer if the interval is reached.
func (t *IntervalTimer) UpdateReset(dt float32) bool {
	if res := t.Update(dt); res {
		t.Reset()
		return true
	}
	return false
}

// Ticked returns true if the current accumulated time has reached or
// exceeded the configured interval. Does not modify the timer.
func (t IntervalTimer) Ticked() bool {
	return t.time >= t.interval
}

// Reset sets the internal time counter back to zero.
func (t *IntervalTimer) Reset() {
	t.time = 0
}
