package formula

import (
	"strings"
	"testing"

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

func TestInferFlowFormulaExpressionPreservesDynamicScalarTypes(t *testing.T) {
	eng := NewEngine()
	schema := &models.ObjectMetadata{
		APIName: "ProgramChild",
		Fields: []models.FieldMetadata{
			{APIName: "Name", Type: constants.FieldTypeString},
		},
	}
	variables := map[string]ExpressionVariableType{
		"lateNumber": {Type: spec.TypeNumber, Dynamic: true},
	}

	got, err := eng.InferFormulaExpressionTypeWithSchemas("lateNumber", schema, nil, variables)
	if err != nil {
		t.Fatalf("InferFormulaExpressionTypeWithSchemas(lateNumber) error = %v", err)
	}
	if got != spec.TypeNumber {
		t.Fatalf("InferFormulaExpressionTypeWithSchemas(lateNumber) = %s, want %s", got, spec.TypeNumber)
	}

	_, err = eng.InferFormulaExpressionTypeWithSchemas("DATE(lateNumber, $Record.Name, 1)", schema, nil, variables)
	if err == nil {
		t.Fatal("InferFormulaExpressionTypeWithSchemas(DATE(lateNumber, $Record.Name, 1)) error = nil, want concrete argument rejection")
	}
	if !strings.Contains(err.Error(), "DATE argument 2") {
		t.Fatalf("InferFormulaExpressionTypeWithSchemas error = %v, want DATE argument 2 rejection", err)
	}
}
