package compatibility

import (
	"testing"

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

func TestRecordViewWireContainsOnlyReviewedNeutralFacts(t *testing.T) {
	read := (&runtimev1.ReadRecordViewRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, read.Fields(), []protoreflect.Name{"object_id", "selector", "projection", "min_catalog_revision", "workspace"})
	workspace := (&runtimev1.RecordViewWorkspaceSelection{}).ProtoReflect().Descriptor()
	assertFieldNames(t, workspace.Fields(), []protoreflect.Name{"sections"})
	selector := (&runtimev1.RecordViewSelector{}).ProtoReflect().Descriptor()
	assertFieldNames(t, selector.Fields(), []protoreflect.Name{"kind", "record_id", "field_id", "field_value"})
	readResponse := (&runtimev1.ReadRecordViewResponse{}).ProtoReflect().Descriptor()
	assertFieldNames(t, readResponse.Fields(), []protoreflect.Name{"record_id", "root", "reference_displays", "attachment_source_fields", "receipts", "access", "authority"})
	selectedAuthority := (&runtimev1.RecordViewSelectedAuthority{}).ProtoReflect().Descriptor()
	assertFieldNames(t, selectedAuthority.Fields(), []protoreflect.Name{"system_permissions", "custom_permissions", "object_permissions", "field_permissions", "record_type_permissions"})
	access := (&runtimev1.RecordViewAccess{}).ProtoReflect().Descriptor()
	assertFieldNames(t, access.Fields(), []protoreflect.Name{"read", "update", "delete", "locked"})
	attachmentField := (&runtimev1.RecordViewAttachmentSourceField{}).ProtoReflect().Descriptor()
	assertFieldNames(t, attachmentField.Fields(), []protoreflect.Name{"source_field_id", "resolver_id"})
	resolve := (&runtimev1.ResolveRecordAttachmentSourcesRequest{}).ProtoReflect().Descriptor()
	assertFieldNames(t, resolve.Fields(), []protoreflect.Name{"parent_object_id", "parent_record_id", "resolver_id", "source_values", "min_catalog_revision"})
	result := (&runtimev1.RecordAttachmentSourceResult{}).ProtoReflect().Descriptor()
	assertFieldNames(t, result.Fields(), []protoreflect.Name{"index", "outcome", "file_id", "file_name"})

	for _, forbidden := range []protoreflect.Name{
		"org_id", "user_id", "principal_id", "permission_map", "security_context", "app_installation_id",
		"query", "sql", "table", "join", "url", "attributes", "sobject", "error_message",
	} {
		for _, fields := range []protoreflect.FieldDescriptors{read.Fields(), workspace.Fields(), selector.Fields(), readResponse.Fields(), selectedAuthority.Fields(), access.Fields(), attachmentField.Fields(), resolve.Fields(), result.Fields()} {
			if fields.ByName(forbidden) != nil {
				t.Fatalf("authority, query, or product fact %q entered record-view protobuf", forbidden)
			}
		}
	}
	if runtimev1.RecordViewReadService_ReadRecordView_FullMethodName != "/nexuscrm.runtime.v1.RecordViewReadService/ReadRecordView" ||
		runtimev1.RecordViewReadService_ResolveRecordAttachmentSources_FullMethodName != "/nexuscrm.runtime.v1.RecordViewReadService/ResolveRecordAttachmentSources" {
		t.Fatal("record-view method identity drifted")
	}
	values := runtimev1.RecordAttachmentSourceOutcome_RECORD_ATTACHMENT_SOURCE_OUTCOME_UNSPECIFIED.Descriptor().Values()
	if values.Len() != 4 {
		t.Fatalf("source outcome vocabulary has %d values", values.Len())
	}
}
