package benchmarks

import (
	"testing"
	"time"

	"github.com/explorer/backend/libs/go-rpc-gateway"
)

// BenchmarkInMemoryCache_Get benchmarks cache Get operations
func BenchmarkInMemoryCache_Get(b *testing.B) {
	cache := gateway.NewInMemoryCache()
	key := "bench-key"
	value := []byte("bench-value")
	cache.Set(key, value, 5*time.Minute)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_, _ = cache.Get(key)
	}
}

// BenchmarkInMemoryCache_Set benchmarks cache Set operations
func BenchmarkInMemoryCache_Set(b *testing.B) {
	cache := gateway.NewInMemoryCache()
	key := "bench-key"
	value := []byte("bench-value")

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = cache.Set(key, value, 5*time.Minute)
	}
}

// BenchmarkInMemoryRateLimiter_Allow benchmarks rate limiter Allow operations
func BenchmarkInMemoryRateLimiter_Allow(b *testing.B) {
	config := gateway.RateLimitConfig{
		RequestsPerSecond: 0,
		RequestsPerMinute: 1000,
		BurstSize:         100,
	}
	limiter := gateway.NewInMemoryRateLimiter(config)
	key := "bench-key"

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = limiter.Allow(key)
	}
}

// BenchmarkCache_Concurrent benchmarks concurrent cache operations
func BenchmarkCache_Concurrent(b *testing.B) {
	cache := gateway.NewInMemoryCache()
	key := "bench-key"
	value := []byte("bench-value")
	cache.Set(key, value, 5*time.Minute)

	b.RunParallel(func(pb *testing.PB) {
		for pb.Next() {
			_, _ = cache.Get(key)
		}
	})
}

// BenchmarkRateLimiter_Concurrent benchmarks concurrent rate limiter operations
func BenchmarkRateLimiter_Concurrent(b *testing.B) {
	config := gateway.RateLimitConfig{
		RequestsPerSecond: 0,
		RequestsPerMinute: 10000,
		BurstSize:         100,
	}
	limiter := gateway.NewInMemoryRateLimiter(config)

	b.RunParallel(func(pb *testing.PB) {
		key := "bench-key"
		for pb.Next() {
			_ = limiter.Allow(key)
		}
	})
}

