package querycodec

import "testing"

func TestParserPreservesTemporalLiteralTypes(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name  string
		query string
		check func(*testing.T, any)
	}{
		{
			name:  "unquoted date",
			query: "SELECT Id FROM Opportunity WHERE CloseDate = 2026-07-20",
			check: func(t *testing.T, value any) {
				t.Helper()
				got, ok := value.(DateLiteralValue)
				if !ok || got != DateLiteralValue("2026-07-20") {
					t.Fatalf("literal = %#v (%T), want DateLiteralValue", value, value)
				}
			},
		},
		{
			name:  "unquoted datetime is canonical UTC",
			query: "SELECT Id FROM Opportunity WHERE CreatedDate >= 2026-07-20T14:34:56.789+02:00",
			check: func(t *testing.T, value any) {
				t.Helper()
				got, ok := value.(DateTimeLiteralValue)
				if !ok || got != DateTimeLiteralValue("2026-07-20T12:34:56.789Z") {
					t.Fatalf("literal = %#v (%T), want canonical DateTimeLiteralValue", value, value)
				}
			},
		},
		{
			name:  "quoted date-shaped text stays string",
			query: "SELECT Id FROM Opportunity WHERE Name = '2026-07-20'",
			check: func(t *testing.T, value any) {
				t.Helper()
				got, ok := value.(string)
				if !ok || got != "2026-07-20" {
					t.Fatalf("literal = %#v (%T), want ordinary string", value, value)
				}
			},
		},
	}

	for _, test := range tests {
		test := test
		t.Run(test.name, func(t *testing.T) {
			t.Parallel()
			request, err := ParseSOQL(test.query)
			if err != nil {
				t.Fatalf("ParseSOQL() error = %v", err)
			}
			if request.Filter.Kind != PredicateComparison || request.Filter.Right.Kind != OperandLiteral {
				t.Fatalf("filter = %#v, want comparison with literal right operand", request.Filter)
			}
			test.check(t, request.Filter.Right.Value)
		})
	}
}
