package metadata

import (
	"context"
	"testing"

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

func TestValidationServiceTreatsRuntimeExactDecimalAsLegacyNumericInput(t *testing.T) {
	minimum, maximum := 0.0, 1000.0
	rangeValidator := "range"
	rangeConfig := `{"min":0,"max":1000}`
	schema := &models.ObjectMetadata{
		APIName: "Invoice",
		Fields: []models.FieldMetadata{{
			APIName:         "Amount",
			Type:            constants.FieldTypeCurrency,
			MinValue:        &minimum,
			MaxValue:        &maximum,
			Validator:       &rangeValidator,
			ValidatorConfig: &rangeConfig,
		}},
	}
	service := NewValidationService(nil)

	if err := service.ValidateRecord(context.Background(), models.SObject{"Amount": schemautil.ExactDecimal("not-a-decimal")}, schema, nil, nil, nil); err == nil {
		t.Fatal("malformed ExactDecimal was accepted before numeric constraints")
	}
	for _, value := range []any{float64(0), int64(0), schemautil.ExactDecimal("0"), schemautil.ExactDecimal("999.9999")} {
		if err := service.ValidateRecord(context.Background(), models.SObject{"Amount": value}, schema, nil, nil, nil); err != nil {
			t.Fatalf("ValidateRecord(Amount=%#v) error = %v, want legacy and Runtime numeric carriers to be equivalent", value, err)
		}
	}

	for _, value := range []schemautil.ExactDecimal{"-0.0001", "1000.0001"} {
		if err := service.ValidateRecord(context.Background(), models.SObject{"Amount": value}, schema, nil, nil, nil); err == nil {
			t.Fatalf("ValidateRecord(Amount=%q) error = nil, want exact min/max enforcement", value)
		}
	}

	decimalMaximum := 0.1
	schema.Fields[0].MaxValue = &decimalMaximum
	if err := service.ValidateRecord(context.Background(), models.SObject{"Amount": schemautil.ExactDecimal("0.100000000000000001")}, schema, nil, nil, nil); err == nil {
		t.Fatal("exact decimal above the metadata-authored 0.1 MaxValue bound was accepted")
	}

	schema.Fields[0].MaxValue = nil
	rangeConfig = `{"min":0,"max":0.1}`
	if err := service.ValidateRecord(context.Background(), models.SObject{"Amount": schemautil.ExactDecimal("0.100000000000000001")}, schema, nil, nil, nil); err == nil {
		t.Fatal("exact decimal above the metadata-authored 0.1 range-validator bound was accepted")
	}
}
