package igdb

import (
	"sync"
	"time"
)

type rateLimiter struct {
	mu         sync.Mutex
	rate       int
	interval   time.Duration
	tokens     int
	lastRefill time.Time
}

func newRateLimiter(rate int) *rateLimiter {
	return &rateLimiter{
		rate:       rate,
		interval:   time.Second,
		tokens:     rate,
		lastRefill: time.Now(),
	}
}

func (r *rateLimiter) wait() {
	r.mu.Lock()
	defer r.mu.Unlock()

	now := time.Now()
	elapsed := now.Sub(r.lastRefill)

	if elapsed >= r.interval {
		r.tokens = r.rate
		r.lastRefill = now
	}

	if r.tokens <= 0 {
		waitTime := r.interval - elapsed
		r.mu.Unlock()
		time.Sleep(waitTime)
		r.mu.Lock()
		r.tokens = r.rate - 1
		r.lastRefill = time.Now()
		return
	}

	r.tokens--
}