package schemautil

import (
	"testing"

	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
)

func staticPicklistSchema() *models.ObjectMetadata {
	return &models.ObjectMetadata{
		APIName: "Account",
		Fields: []models.FieldMetadata{
			{
				APIName: "Sales_Territory_NA_Only__c",
				Type:    constants.FieldTypePicklist,
				Options: models.PicklistOptionsFromStrings([]string{
					"Northwest (AK, WA, OR, ID, BC, AB)",
					"California (NorCal - Bay Area south)",
					"  Whitespace Sensitive  ",
				}),
			},
		},
	}
}

func TestNormalizeSObject_StaticPicklistCanonicalStorage(t *testing.T) {
	tests := []struct {
		name  string
		input interface{}
		want  interface{}
	}{
		{name: "carriage return only", input: "\r", want: nil},
		{name: "whitespace only", input: "   ", want: nil},
		{name: "exact whitespace-sensitive option", input: "  Whitespace Sensitive  ", want: "  Whitespace Sensitive  "},
		{name: "trailing CR on option", input: "California (NorCal - Bay Area south)\r", want: "California (NorCal - Bay Area south)"},
		{name: "surrounding space on option", input: "  Northwest (AK, WA, OR, ID, BC, AB)  ", want: "Northwest (AK, WA, OR, ID, BC, AB)"},
		{name: "nil value", input: nil, want: nil},
		{name: "non-string value", input: 123, want: 123},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := NormalizeSObject(staticPicklistSchema(), models.SObject{"Sales_Territory_NA_Only__c": tt.input})
			if got["Sales_Territory_NA_Only__c"] != tt.want {
				t.Fatalf("Sales_Territory_NA_Only__c = %#v, want %#v", got["Sales_Territory_NA_Only__c"], tt.want)
			}
		})
	}
}

func TestNormalizeSObject_RuntimeScopedPicklistPreservesRawString(t *testing.T) {
	validator := " Runtime_Scoped_Picklist "
	schema := staticPicklistSchema()
	schema.Fields[0].Validator = &validator

	got := NormalizeSObject(schema, models.SObject{"Sales_Territory_NA_Only__c": "  Runtime Value\r"})
	if got["Sales_Territory_NA_Only__c"] != "  Runtime Value\r" {
		t.Fatalf("runtime-scoped Sales_Territory_NA_Only__c = %#v, want raw string preserved", got["Sales_Territory_NA_Only__c"])
	}
}
