package middlewares

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

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/assert"

	"GoMembership/internal/config"
)

func TestAPIKeyMiddleware(t *testing.T) {
	// Set up a test API key
	testAPIKey := "test-api-key-12345"
	config.Auth.APIKEY = testAPIKey

	// Set Gin to Test Mode
	gin.SetMode(gin.TestMode)

	// Tests table
	tests := []struct {
		name       string
		apiKey     string
		wantStatus int
	}{
		{"Valid API Key", testAPIKey, http.StatusOK},
		{"Missing API Key", "", http.StatusUnauthorized},
		{"Invalid API Key", "wrong-key", http.StatusUnauthorized},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			// Set up a new test router and handler
			router := gin.New()
			router.Use(APIKeyMiddleware())
			router.GET("/test", func(c *gin.Context) {
				c.Status(http.StatusOK)
			})

			// Create a test request
			w := httptest.NewRecorder()
			req, _ := http.NewRequest("GET", "/test", nil)
			if tt.apiKey != "" {
				req.Header.Set("X-API-Key", tt.apiKey)
			}

			// Serve the request
			router.ServeHTTP(w, req)

			// Assert the response
			assert.Equal(t, tt.wantStatus, w.Code)

			// Additional assertions for specific cases
			if tt.wantStatus == http.StatusUnauthorized {
				assert.Contains(t, w.Body.String(), "API key")
			}
		})
	}
}
