package keyspacepoolconfig

import (
	"context"
	"sync"

	"golang.org/x/time/rate"
)

const createRateLimiterBurst = 1

type waitLimiter interface {
	Wait(context.Context) error
}

type createRateLimiter struct {
	mu         sync.Mutex
	limiter    waitLimiter
	rateLimit  float64
	newLimiter func(limit float64) waitLimiter
}

func newCreateRateLimiter() *createRateLimiter {
	return &createRateLimiter{
		newLimiter: func(limit float64) waitLimiter {
			return rate.NewLimiter(rate.Limit(limit), createRateLimiterBurst)
		},
	}
}

func (r *createRateLimiter) wait(ctx context.Context, limit float64) error {
	if r == nil || limit <= 0 {
		if r != nil {
			r.mu.Lock()
			r.limiter = nil
			r.rateLimit = 0
			r.mu.Unlock()
		}
		return nil
	}

	r.mu.Lock()
	if r.limiter == nil || r.rateLimit != limit {
		r.limiter = r.newLimiter(limit)
		r.rateLimit = limit
	}
	limiter := r.limiter
	r.mu.Unlock()

	return limiter.Wait(ctx)
}
