package compatibility

import (
	"reflect"
	"testing"

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

func TestIdentityExchangeWireContainsOnlyReviewedSemanticFacts(t *testing.T) {
	request := (&runtimev1.ExchangeRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, request.Fields(), []protoreflect.Name{"app_installation_id", "requested_runtime_capabilities"})
	response := (&runtimev1.ExchangeResponse{}).ProtoReflect().Descriptor()
	assertFieldNames(t, response.Fields(), []protoreflect.Name{"opaque_delegation", "expires_at_unix_second"})
	for _, forbidden := range []protoreflect.Name{
		"bearer", "authorization", "org_id", "principal_id", "session_id", "caller_workload_id",
		"runtime_audience", "auth_epoch", "security_epoch", "permission_map", "signing_key",
	} {
		if request.Fields().ByName(forbidden) != nil || response.Fields().ByName(forbidden) != nil {
			t.Fatalf("caller/authority fact %q entered IdentityContext protobuf", forbidden)
		}
	}
	if runtimev1.IdentityContextService_Exchange_FullMethodName != "/nexuscrm.runtime.v1.IdentityContextService/Exchange" {
		t.Fatalf("method = %q", runtimev1.IdentityContextService_Exchange_FullMethodName)
	}
}

func assertFieldNames(t *testing.T, fields protoreflect.FieldDescriptors, want []protoreflect.Name) {
	t.Helper()
	got := make([]protoreflect.Name, fields.Len())
	for i := range fields.Len() {
		got[i] = fields.Get(i).Name()
	}
	if !reflect.DeepEqual(got, want) {
		t.Fatalf("fields = %v, want %v", got, want)
	}
}
