package audit

import (
	"testing"

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

func TestBuildHistoryQueryPlanRequiresParentObject(t *testing.T) {
	if _, err := BuildHistoryQueryPlan("", []string{"Field"}); err == nil {
		t.Fatal("BuildHistoryQueryPlan returned nil error for empty parent object")
	}
}

func TestApplyHistoryQueryFilterValidatesMetadataColumnsAndOperators(t *testing.T) {
	filter := queryspec.And(
		queryspec.FieldPredicate("Field", "==", "StageName"),
		queryspec.FieldPredicate("CreatedDate", ">=", "2026-07-01T00:00:00.000Z"),
	)
	plan, err := applyHistoryQueryFilter(HistoryQueryPlan{ObjectApiName: "Opportunity"}, filter)
	if err != nil {
		t.Fatalf("ApplyHistoryQueryFilter: %v", err)
	}
	if got := plan.filters[0].column; got != "FieldName" {
		t.Fatalf("first filter column = %q, want FieldName", got)
	}
	if got := plan.filters[0].operator; got != "=" {
		t.Fatalf("first filter operator = %q, want SQL equality", got)
	}
	if got := plan.filters[1].column; got != "ChangedAt" {
		t.Fatalf("second filter column = %q, want ChangedAt", got)
	}

	for _, filter := range []queryspec.Predicate{
		queryspec.FieldPredicate("OldValue", "=", "Prospecting"),
		queryspec.FieldPredicate("Field", "IN", nil),
		queryspec.FieldPredicate("Field", "IN", "StageName"),
		queryspec.FieldPredicate("Field", "=", []string{"StageName"}),
		queryspec.FieldPredicate("FieldName", "=", "StageName"),
		queryspec.Or(queryspec.FieldPredicate("Field", "=", "StageName"), queryspec.FieldPredicate("Field", "=", "Probability")),
	} {
		if _, err := applyHistoryQueryFilter(HistoryQueryPlan{ObjectApiName: "Opportunity"}, filter); err == nil {
			t.Fatalf("ApplyHistoryQueryFilter(%#v) error = nil, want fail-closed validation", filter)
		}
	}
}

func TestHistoryFilterEqualityAcceptsSQLAndEngineSpellings(t *testing.T) {
	for _, operator := range []string{"=", "=="} {
		plan, err := applyHistoryQueryFilter(
			HistoryQueryPlan{ObjectApiName: "Account"},
			queryspec.FieldPredicate("Field", operator, "Name"),
		)
		if err != nil {
			t.Fatalf("operator %q: %v", operator, err)
		}
		if len(plan.filters) != 1 || plan.filters[0].operator != "=" {
			t.Fatalf("operator %q lowered filters = %#v, want one SQL equality", operator, plan.filters)
		}
	}
}
