syntax = "proto3";

package nexuscrm.runtime.v1;

import "common/v1/common.proto";

option go_package = "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/runtime/v1;runtimev1";

// MetadataAdminReadService exposes four coarse, delegated-user reads over the
// current neutral metadata implementation. Product routes and response DTOs
// remain L1-owned. Stored layout reads are distinct from effective
// presentation-layout reads by service method and response type.
service MetadataAdminReadService {
  rpc ReadObjectAdminIndex(ReadObjectAdminIndexRequest) returns (ReadObjectAdminIndexResponse);
  rpc ReadLayoutAdminWorkspace(ReadLayoutAdminWorkspaceRequest) returns (ReadLayoutAdminWorkspaceResponse);
  rpc ReadStoredLayout(ReadStoredLayoutRequest) returns (ReadStoredLayoutResponse);
  rpc ReadValidationRuleAdminIndex(ReadValidationRuleAdminIndexRequest) returns (ReadValidationRuleAdminIndexResponse);
}

message ReadObjectAdminIndexRequest {
  optional uint64 min_catalog_revision = 1;
}

message ObjectAdminMetadata {
  string object_id = 1;
  optional string description = 2;
  string delete_mode = 3;
}

message ReadObjectAdminIndexResponse {
  repeated ObjectAdminMetadata objects = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
}

message ReadLayoutAdminWorkspaceRequest {
  string object_id = 1;
  optional uint64 min_catalog_revision = 2;
}

message StoredLayoutSummary {
  string layout_id = 1;
  string object_id = 2;
  string name = 3;
  string type = 4;
  bool is_default = 5;
  string created_at = 6;
  string last_modified_at = 7;
}

message StoredLayoutAssignmentDimension {
  string key = 1;
  string value = 2;
}

message StoredLayoutAssignment {
  string assignment_id = 1;
  string object_id = 2;
  string layout_id = 3;
  repeated StoredLayoutAssignmentDimension dimensions = 4;
  uint32 specificity = 5;
  string created_at = 6;
  string last_modified_at = 7;
  optional string created_by_id = 8;
}

message ReadLayoutAdminWorkspaceResponse {
  string object_id = 1;
  repeated StoredLayoutSummary layouts = 2;
  repeated StoredLayoutAssignment assignments = 3;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 4;
}

message ReadStoredLayoutRequest {
  string layout_id = 1;
  optional uint64 min_catalog_revision = 2;
}

message ReadStoredLayoutResponse {
  string layout_id = 1;
  string object_id = 2;
  bytes stored_document = 3;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 4;
}

message ReadValidationRuleAdminIndexRequest {
  string object_id = 1;
  optional uint64 min_catalog_revision = 2;
}

message ValidationRuleRecordSetFilter {
  string field = 1;
  string operator = 2;
  string value_source = 3;
  bytes value_json = 4;
}

message ValidationRuleRecordSetBinding {
  string name = 1;
  string mode = 2;
  string object_id = 3;
  string filter_logic = 4;
  repeated ValidationRuleRecordSetFilter filters = 5;
}

message ValidationRuleAdminMetadata {
  string rule_id = 1;
  string object_id = 2;
  string name = 3;
  optional string description = 4;
  bool active = 5;
  string condition = 6;
  string error_message = 7;
  optional string error_display_field = 8;
  repeated ValidationRuleRecordSetBinding record_set_bindings = 9;
  bool is_customized = 10;
  optional string owner_pack = 11;
}

message ReadValidationRuleAdminIndexResponse {
  string object_id = 1;
  repeated ValidationRuleAdminMetadata rules = 2;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 3;
}
