package analytics

import (
	"reflect"
	"testing"

	"github.com/nexuscrm/shared/pkg/queryspec"
)

func TestLowerQueryFilterPredicateKeepsTypedINAsCriteriaOnly(t *testing.T) {
	ids := []interface{}{"001A", "001B"}
	filter := queryspec.And(
		queryspec.FieldPredicate("IsDeleted", "=", true),
		queryspec.FieldPredicate("Id", "IN", ids),
	)

	lowered, err := lowerQueryFilterPredicate(filter)
	if err != nil {
		t.Fatalf("lowerQueryFilterPredicate() error = %v", err)
	}
	if lowered.expression != "" {
		t.Fatalf("expression = %q, want criteria-only lowering", lowered.expression)
	}
	if len(lowered.criteria) != 2 {
		t.Fatalf("criteria = %#v, want two criteria", lowered.criteria)
	}
	if got := lowered.criteria[1]; got.Field != "Id" || got.Op != "IN" || !reflect.DeepEqual(got.Val, ids) {
		t.Fatalf("IN criterion = %#v, want typed ids %#v", got, ids)
	}
}

func TestLowerQueryFilterPredicateSplitsCriteriaAndExpression(t *testing.T) {
	filter := queryspec.And(
		queryspec.FieldPredicate("OwnerId", "=", "005-user"),
		queryspec.FormulaPredicate("Name != nil"),
	)

	lowered, err := lowerQueryFilterPredicate(filter)
	if err != nil {
		t.Fatalf("lowerQueryFilterPredicate() error = %v", err)
	}
	if lowered.expression != "(Name != nil)" {
		t.Fatalf("expression = %q, want formula child only", lowered.expression)
	}
	if len(lowered.criteria) != 1 || lowered.criteria[0].Field != "OwnerId" || lowered.criteria[0].Val != "005-user" {
		t.Fatalf("criteria = %#v, want OwnerId criterion", lowered.criteria)
	}
}

func TestLowerQueryExpressionPredicatePreservesSQLLikeForHaving(t *testing.T) {
	having := queryspec.Or(
		queryspec.ComparisonPredicate(queryspec.FieldOperand("Body"), "LIKE", queryspec.LiteralOperand("%Record.Link%")),
		queryspec.ComparisonPredicate(queryspec.FieldOperand("HtmlValue"), "NOT LIKE", queryspec.LiteralOperand("prefix-%@example.com")),
	)

	lowered, err := lowerQueryExpressionPredicate(having)
	if err != nil {
		t.Fatalf("lowerQueryExpressionPredicate() error = %v", err)
	}
	want := "(Body LIKE '%Record.Link%') OR (HtmlValue NOT LIKE 'prefix-%@example.com')"
	if lowered != want {
		t.Fatalf("lowerQueryExpressionPredicate() = %q, want %q", lowered, want)
	}
}
