package utils

import "testing"

func TestSanitizeDeveloperName(t *testing.T) {
	tests := []struct {
		name     string
		input    string
		expected string
	}{
		// Basic cases
		{"empty string", "", ""},
		{"simple name", "MyReport", "MyReport"},
		{"with spaces", "My Report", "My_Report"},

		// Special characters
		{"special chars", "My@Report#2024!", "MyReport2024"},
		{"unicode chars", "Réport Ñame", "Rport_ame"},
		{"only special chars", "@#$%", DefaultDeveloperName},

		// Numeric prefix
		{"starts with number", "123Report", "X123Report"},
		{"only numbers", "12345", "X12345"},

		// Underscores
		{"consecutive spaces", "My   Report", "My_Report"},
		{"leading underscore", "_MyReport", "MyReport"},
		{"trailing underscore", "MyReport_", "MyReport"},
		{"multiple underscores", "My___Report", "My_Report"},
		{"only underscores", "___", DefaultDeveloperName},

		// Edge cases
		{"single char", "A", "A"},
		{"single number", "5", "X5"},
		{"mixed case", "myREPORT", "myREPORT"},
		{"already valid", "Valid_Name_123", "Valid_Name_123"},

		// Length limit
		{"exceeds max length", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},
		{"truncation trailing underscore", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_B", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := SanitizeDeveloperName(tt.input)
			if result != tt.expected {
				t.Errorf("SanitizeDeveloperName(%q) = %q, want %q", tt.input, result, tt.expected)
			}
		})
	}
}

func TestGetSObjectString(t *testing.T) {
	tests := []struct {
		name     string
		obj      map[string]interface{}
		key      string
		expected string
	}{
		{"existing key", map[string]interface{}{"Name": "Test"}, "Name", "Test"},
		{"missing key", map[string]interface{}{"Name": "Test"}, "Id", ""},
		{"nil value", map[string]interface{}{"Name": nil}, "Name", ""},
		{"non-string value", map[string]interface{}{"Count": 42}, "Count", ""},
		{"empty map", map[string]interface{}{}, "Name", ""},
		{"nil map", nil, "Name", ""},
		{"empty string", map[string]interface{}{"Name": ""}, "Name", ""},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := GetSObjectString(tt.obj, tt.key)
			if result != tt.expected {
				t.Errorf("GetSObjectString(%v, %q) = %q, want %q", tt.obj, tt.key, result, tt.expected)
			}
		})
	}
}
