package twitch

import "time"

const keepaliveTrackerCheckInterval = 100 * time.Millisecond

type (
	keepaliveTracker struct {
		c       chan<- struct{}
		expires time.Time
		renewed time.Time
	}
)

func newKeepaliveTracker(timeout chan<- struct{}, d time.Duration) *keepaliveTracker {
	t := &keepaliveTracker{
		c:       timeout,
		expires: time.Now().Add(d),
	}

	go t.run()

	return t
}

func (t keepaliveTracker) ExpiresAt() time.Time { return t.expires }
func (t keepaliveTracker) LastRenew() time.Time { return t.renewed }

func (t *keepaliveTracker) Renew(d time.Duration) {
	t.expires = time.Now().Add(d)
	t.renewed = time.Now()
}

func (t *keepaliveTracker) run() {
	for t.expires.After(time.Now()) {
		time.Sleep(keepaliveTrackerCheckInterval)
	}
	t.c <- struct{}{}
}