package service

import (
	"net/http"
	"testing"
)

// =============================================================================
// Header Utility Functions Tests
// =============================================================================

func TestResolveWireCasing(t *testing.T) {
	tests := []struct {
		name     string
		key      string
		expected string
	}{
		{"lowercase key", "content-type", "Content-Type"},
		{"already canonical", "Content-Type", "Content-Type"},
		{"unknown key", "x-custom-header", "x-custom-header"},
		{"anthropic-beta", "anthropic-beta", "anthropic-beta"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := resolveWireCasing(tt.key)
			// The expected result depends on the headerWireCasing map
			// We just verify the function doesn't panic and returns a string
			if result == "" && tt.key != "" {
				t.Errorf("resolveWireCasing(%q) returned empty string", tt.key)
			}
		})
	}
}

func TestSortHeadersByWireOrder(t *testing.T) {
	t.Run("sort headers in wire order", func(t *testing.T) {
		h := make(http.Header)
		h.Set("Content-Type", "application/json")
		h.Set("X-Custom-Header", "value")
		h.Set("Authorization", "Bearer token")

		result := sortHeadersByWireOrder(h)
		if len(result) != 3 {
			t.Errorf("Expected 3 headers, got %d", len(result))
		}
	})

	t.Run("empty headers", func(t *testing.T) {
		h := make(http.Header)
		result := sortHeadersByWireOrder(h)
		if len(result) != 0 {
			t.Errorf("Expected 0 headers, got %d", len(result))
		}
	})
}

func TestSetHeaderRaw(t *testing.T) {
	t.Run("set header", func(t *testing.T) {
		h := make(http.Header)
		setHeaderRaw(h, "X-Custom-Header", "value1")
		if h.Get("X-Custom-Header") != "value1" {
			t.Errorf("Expected 'value1', got %q", h.Get("X-Custom-Header"))
		}
	})

	t.Run("overwrite header", func(t *testing.T) {
		h := make(http.Header)
		setHeaderRaw(h, "X-Test", "value1")
		setHeaderRaw(h, "X-Test", "value2")
		if h.Get("X-Test") != "value2" {
			t.Errorf("Expected 'value2', got %q", h.Get("X-Test"))
		}
	})
}

func TestAddHeaderRaw(t *testing.T) {
	t.Run("add single header", func(t *testing.T) {
		h := make(http.Header)
		addHeaderRaw(h, "X-Add-Header", "value1")
		if h.Get("X-Add-Header") != "value1" {
			t.Errorf("Expected 'value1', got %q", h.Get("X-Add-Header"))
		}
	})

	t.Run("add multiple values", func(t *testing.T) {
		h := make(http.Header)
		addHeaderRaw(h, "X-Multi", "value1")
		addHeaderRaw(h, "X-Multi", "value2")
		values := h.Values("X-Multi")
		if len(values) != 2 {
			t.Errorf("Expected 2 values, got %d", len(values))
		}
	})
}

func TestGetHeaderRaw(t *testing.T) {
	t.Run("get existing header", func(t *testing.T) {
		h := make(http.Header)
		h.Set("X-Get-Test", "testvalue")
		result := getHeaderRaw(h, "X-Get-Test")
		if result != "testvalue" {
			t.Errorf("Expected 'testvalue', got %q", result)
		}
	})

	t.Run("get non-existent header", func(t *testing.T) {
		h := make(http.Header)
		result := getHeaderRaw(h, "X-Nonexistent")
		if result != "" {
			t.Errorf("Expected empty string, got %q", result)
		}
	})
}
