package middleware

import (
	"net/http/httptest"
	"testing"
	"time"
)

func TestRateLimiterBlocksAfterWindowLimit(t *testing.T) {
	now := time.Date(2026, 6, 6, 12, 0, 0, 0, time.UTC)
	limiter := NewRateLimiter(RateLimitOptions{
		Enabled:     true,
		Window:      time.Minute,
		MaxRequests: 2,
	})
	limiter.now = func() time.Time { return now }

	req := httptest.NewRequest("GET", "/v1/me", nil)
	req.RemoteAddr = "203.0.113.10:12345"

	if allowed, _, err := limiter.allow(req.Context(), keyForRequest(req)); err != nil || !allowed {
		t.Fatal("first request should be allowed")
	}
	if allowed, _, err := limiter.allow(req.Context(), keyForRequest(req)); err != nil || !allowed {
		t.Fatal("second request should be allowed")
	}
	if allowed, retryAfter, err := limiter.allow(req.Context(), keyForRequest(req)); err != nil || allowed || retryAfter <= 0 {
		t.Fatalf("third request should be blocked with retryAfter, allowed=%v retryAfter=%s", allowed, retryAfter)
	}
}

func TestRateLimiterResetsAfterWindow(t *testing.T) {
	now := time.Date(2026, 6, 6, 12, 0, 0, 0, time.UTC)
	limiter := NewRateLimiter(RateLimitOptions{
		Enabled:     true,
		Window:      time.Minute,
		MaxRequests: 1,
	})
	limiter.now = func() time.Time { return now }

	req := httptest.NewRequest("GET", "/v1/me", nil)
	req.RemoteAddr = "203.0.113.11:12345"

	if allowed, _, err := limiter.allow(req.Context(), keyForRequest(req)); err != nil || !allowed {
		t.Fatal("first request should be allowed")
	}
	if allowed, _, err := limiter.allow(req.Context(), keyForRequest(req)); err != nil || allowed {
		t.Fatal("second request in same window should be blocked")
	}
	now = now.Add(time.Minute)
	if allowed, _, err := limiter.allow(req.Context(), keyForRequest(req)); err != nil || !allowed {
		t.Fatal("request after window should be allowed")
	}
}
