package utils_test

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

	"github.com/fiskerinc/cloud-services/pkg/utils"
)

func TestParseVINFromRequestBothFormats(t *testing.T) {
	testVIN := "1F15K3R45N1234567"
	
	tests := []struct {
		name           string
		headerName     string
		headerValue    string
		expectedVIN    string
		expectedError  bool
		description    string
	}{
		{
			name:          "SDK 1.2 format - Ssl-Client-Subject-Dn",
			headerName:    "Ssl-Client-Subject-Dn",
			headerValue:   "CN=" + testVIN,
			expectedVIN:   testVIN,
			expectedError: false,
			description:   "Should parse VIN from SDK 1.2 Ssl-Client-Subject-Dn header",
		},
		{
			name:          "SDK 1.4 format - Ssl header",
			headerName:    "Ssl",
			headerValue:   "CN=" + testVIN,
			expectedVIN:   testVIN,
			expectedError: false,
			description:   "Should parse VIN from SDK 1.4 Ssl header",
		},
		{
			name:          "Both headers present - should prefer SDK 1.2",
			headerName:    "both",
			headerValue:   "CN=" + testVIN,
			expectedVIN:   testVIN,
			expectedError: false,
			description:   "When both headers present, should use SDK 1.2 format first",
		},
		{
			name:          "No VIN headers present",
			headerName:    "none",
			headerValue:   "",
			expectedVIN:   "",
			expectedError: true,
			description:   "Should return error when no VIN headers are present",
		},
		{
			name:          "Invalid header format - no CN prefix",
			headerName:    "Ssl-Client-Subject-Dn",
			headerValue:   testVIN, // Missing CN= prefix
			expectedVIN:   "",
			expectedError: true,
			description:   "Should return error when header doesn't have CN= prefix",
		},
		{
			name:          "Empty CN value",
			headerName:    "Ssl",
			headerValue:   "CN=",
			expectedVIN:   "",
			expectedError: true,
			description:   "Should return error when CN value is empty",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			// Create HTTP request
			req := httptest.NewRequest("GET", "/", nil)
			
			// Set headers based on test case
			switch tt.headerName {
			case "Ssl-Client-Subject-Dn":
				req.Header.Set("Ssl-Client-Subject-Dn", tt.headerValue)
			case "Ssl":
				req.Header.Set("Ssl", tt.headerValue)
			case "both":
				req.Header.Set("Ssl-Client-Subject-Dn", tt.headerValue)
				req.Header.Set("Ssl", "CN=DIFFERENT_VIN") // Should not be used
			case "none":
				// Don't set any headers
			}

			// Call function under test
			vin, err := utils.ParseVINFromRequest(req)

			// Verify results
			if tt.expectedError {
				if err == nil {
					t.Errorf("%s: expected error but got none", tt.description)
				}
			} else {
				if err != nil {
					t.Errorf("%s: unexpected error: %v", tt.description, err)
				}
				if vin != tt.expectedVIN {
					t.Errorf("%s: expected VIN %s, got %s", tt.description, tt.expectedVIN, vin)
				}
			}
		})
	}
}

// Test backward compatibility - existing SDK 1.2 test should still pass
func TestParseVINFromRequestLegacy(t *testing.T) {
	const subjectDNHeader = "Ssl-Client-Subject-Dn"
	
	req := httptest.NewRequest("GET", "/", nil)
	req.Header.Set(subjectDNHeader, "CN=1F15K3R45N1234567")

	vin, err := utils.ParseVINFromRequest(req)
	if err != nil {
		t.Errorf("TestParseVINFromRequestLegacy: unexpected error: %v", err)
	}
	if vin != "1F15K3R45N1234567" {
		t.Errorf("TestParseVINFromRequestLegacy: expected VIN 1F15K3R45N1234567, got %s", vin)
	}
}

// Test SDK 1.4 specific format
func TestParseVINFromRequestSDK14(t *testing.T) {
	req := httptest.NewRequest("GET", "/", nil)
	req.Header.Set("Ssl", "CN=1F15K3R45N1234567")

	vin, err := utils.ParseVINFromRequest(req)
	if err != nil {
		t.Errorf("TestParseVINFromRequestSDK14: unexpected error: %v", err)
	}
	if vin != "1F15K3R45N1234567" {
		t.Errorf("TestParseVINFromRequestSDK14: expected VIN 1F15K3R45N1234567, got %s", vin)
	}
}
