package validation

import (
	"testing"

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

func TestSchemaValidator_ValidateSchemaCompliance(t *testing.T) {
	// Setup Schema
	schema := &models.ObjectMetadata{
		APIName: "TestObject",
		Fields: []models.FieldMetadata{
			{APIName: "Name", Type: constants.FieldTypeString},
			{APIName: "Age", Type: constants.FieldTypeDouble},
			{APIName: "IsActive", Type: constants.FieldTypeBoolean},
			{APIName: "Source", Type: constants.FieldTypePicklist, Options: models.PicklistOptionsFromStrings([]string{"Web", "Partner"})},
		},
	}

	validator := NewSchemaValidator()

	tests := []struct {
		name      string
		data      models.SObject
		isUpdate  bool
		wantError bool
	}{
		{
			name: "Valid Data",
			data: models.SObject{
				"Name": "Test",
				"Age":  30,
			},
			wantError: false,
		},
		{
			name: "Unknown Field",
			data: models.SObject{
				"Name":    "Test",
				"Unknown": "Value",
			},
			wantError: true,
		},
		{
			name: "Attributes Field (Ignored)",
			data: models.SObject{
				"Name":       "Test",
				"attributes": map[string]interface{}{"type": "TestObject"},
			},
			wantError: false,
		},
		{
			name: "Typo in Field Name",
			data: models.SObject{
				"name": "Test", // Lowercase 'n' not in schema
			},
			wantError: true,
		},
		// Boolean field type coercion tests (Ref #248)
		{
			name:      "Boolean native true",
			data:      models.SObject{"IsActive": true},
			wantError: false,
		},
		{
			name:      "Boolean native false",
			data:      models.SObject{"IsActive": false},
			wantError: false,
		},
		{
			name:      "Boolean float64 0 (JSON numeric)",
			data:      models.SObject{"IsActive": float64(0)},
			wantError: false,
		},
		{
			name:      "Boolean float64 1 (JSON numeric)",
			data:      models.SObject{"IsActive": float64(1)},
			wantError: false,
		},
		{
			name:      "Boolean float64 invalid value",
			data:      models.SObject{"IsActive": float64(2)},
			wantError: true,
		},
		{
			name:      "Boolean string true",
			data:      models.SObject{"IsActive": "true"},
			wantError: false,
		},
		{
			name:      "Boolean string false",
			data:      models.SObject{"IsActive": "false"},
			wantError: false,
		},
		{
			name:      "Boolean string invalid",
			data:      models.SObject{"IsActive": "maybe"},
			wantError: true,
		},
		{
			name:      "Picklist active option",
			data:      models.SObject{"Source": "Web"},
			wantError: false,
		},
		{
			name:      "Picklist blank value",
			data:      models.SObject{"Source": ""},
			wantError: false,
		},
		{
			name:      "Picklist inactive option",
			data:      models.SObject{"Source": "Not In Metadata"},
			wantError: true,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			// Act
			err := validator.ValidateSchemaCompliance(tt.data, schema, tt.isUpdate, false)

			// Assert
			if tt.wantError && err == nil {
				t.Errorf("Expected error but got none")
			}
			if !tt.wantError && err != nil {
				t.Errorf("Expected no error but got: %v", err)
			}
		})
	}
}
