package gut

import "time"

type FPS struct {
	done chan struct{}
	cnt  chan struct{}

	curr int

	total  int
	frame  int
	frames []int
	i      int
}

func NewFPS() *FPS {
	fps := &FPS{
		done:   make(chan struct{}),
		cnt:    make(chan struct{}, 100),
		curr:   0,               // to display
		total:  0,               // sum of frames
		frame:  0,               // current frame
		frames: make([]int, 20), // all frames
		i:      0,               // frame index
	}
	go fps.count()
	return fps
}

func (f *FPS) count() {
	ticker := time.NewTicker(50 * time.Millisecond)
	for {
		select {
		case <-f.done:
			return
		case <-f.cnt:
			f.frame++
		case <-ticker.C:
			f.total -= f.frames[f.i]
			f.frames[f.i] = f.frame
			f.total += f.frames[f.i]
			f.frame = 0
			f.i = (f.i + 1) % len(f.frames)
			f.curr = f.total
		}
	}
}

func (f *FPS) Count() {
	f.cnt <- struct{}{}
}

func (f *FPS) Current() int {
	return f.curr
}

func (f *FPS) Destroy() {
	close(f.done)
}