package compatibility

import (
	"testing"

	runtimev1 "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/runtime/v1"
	"google.golang.org/protobuf/reflect/protoreflect"
)

func TestRelatedCountWireContainsOnlyReviewedSemanticFacts(t *testing.T) {
	request := (&runtimev1.CountRelatedRecordsRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, request.Fields(), []protoreflect.Name{"counts", "min_catalog_revision"})
	spec := (&runtimev1.RelatedRecordCountSpec{}).ProtoReflect().Descriptor()
	assertFieldNames(t, spec.Fields(), []protoreflect.Name{"parent_record_id", "child_object_id", "relationship_field", "match_value"})
	result := (&runtimev1.RelatedRecordCountResult{}).ProtoReflect().Descriptor()
	assertFieldNames(t, result.Fields(), []protoreflect.Name{"index", "outcome", "count"})
	response := (&runtimev1.CountRelatedRecordsResponse{}).ProtoReflect().Descriptor()
	assertFieldNames(t, response.Fields(), []protoreflect.Name{"results", "receipts"})

	for _, forbidden := range []protoreflect.Name{
		"org_id", "user_id", "principal_id", "permission_map", "security_context",
		"app_installation_id", "missing", "forbidden", "error_message", "query",
	} {
		if request.Fields().ByName(forbidden) != nil || spec.Fields().ByName(forbidden) != nil ||
			result.Fields().ByName(forbidden) != nil || response.Fields().ByName(forbidden) != nil {
			t.Fatalf("authority, disclosure, or product fact %q entered related-count protobuf", forbidden)
		}
	}
	if runtimev1.RelatedRecordCountService_CountRelatedRecords_FullMethodName != "/nexuscrm.runtime.v1.RelatedRecordCountService/CountRelatedRecords" {
		t.Fatalf("method = %q", runtimev1.RelatedRecordCountService_CountRelatedRecords_FullMethodName)
	}
	values := runtimev1.RelatedRecordCountOutcome_RELATED_RECORD_COUNT_OUTCOME_UNSPECIFIED.Descriptor().Values()
	if values.Len() != 3 {
		t.Fatalf("outcome vocabulary has %d values, want exactly unspecified/counted/not-available", values.Len())
	}
	wantOutcomes := []protoreflect.Name{
		"RELATED_RECORD_COUNT_OUTCOME_UNSPECIFIED",
		"RELATED_RECORD_COUNT_OUTCOME_COUNTED",
		"RELATED_RECORD_COUNT_OUTCOME_NOT_AVAILABLE",
	}
	for index, want := range wantOutcomes {
		if got := values.Get(index).Name(); got != want {
			t.Fatalf("outcome %d = %q, want %q", index, got, want)
		}
	}
}
