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";

// PermissionAdministrationService exposes bounded stored authoring state. It
// is distinct from caller-effective permission evaluation. Runtime owns
// administration authority, transactions, Permission State advancement, and
// persistence; product HTTP routes and public response shapes remain L1-owned.
service PermissionAdministrationService {
  rpc ReadPermissionAdministration(ReadPermissionAdministrationRequest) returns (ReadPermissionAdministrationResponse);
  rpc MutatePermissionAdministration(MutatePermissionAdministrationRequest) returns (MutatePermissionAdministrationResponse);
}

enum PermissionAdministrationReadSelector {
  PERMISSION_ADMINISTRATION_READ_SELECTOR_UNSPECIFIED = 0;
  PERMISSION_ADMINISTRATION_READ_SELECTOR_SYSTEM_CATALOG = 1;
  PERMISSION_ADMINISTRATION_READ_SELECTOR_SYSTEM_GRANTS = 2;
  PERMISSION_ADMINISTRATION_READ_SELECTOR_RECORD_TYPE_CATALOG = 3;
  PERMISSION_ADMINISTRATION_READ_SELECTOR_RECORD_TYPE_GRANTS = 4;
  PERMISSION_ADMINISTRATION_READ_SELECTOR_CUSTOM_CATALOG = 5;
  PERMISSION_ADMINISTRATION_READ_SELECTOR_CUSTOM_GRANTS = 6;
}

enum PermissionAdministrationMutationSelector {
  PERMISSION_ADMINISTRATION_MUTATION_SELECTOR_UNSPECIFIED = 0;
  PERMISSION_ADMINISTRATION_MUTATION_SELECTOR_SYSTEM_GRANTS = 1;
  PERMISSION_ADMINISTRATION_MUTATION_SELECTOR_RECORD_TYPE_GRANTS = 2;
  PERMISSION_ADMINISTRATION_MUTATION_SELECTOR_CUSTOM_GRANTS = 3;
}

message ReadPermissionAdministrationRequest {
  PermissionAdministrationReadSelector selector = 1;
  string permission_set_id = 2;
  optional uint64 min_catalog_revision = 3;
}

message PermissionAdministrationSystemPermission {
  string permission_id = 1;
  string label = 2;
  string category = 3;
  string description = 4;
  string requires_permission_id = 5;
}

message PermissionAdministrationRecordType {
  string record_type_id = 1;
  string resource_type = 2;
  string stable_name = 3;
  string label = 4;
  bool active = 5;

  // Public-dialect record-type presentation remains L1-owned.
  reserved 6;
  reserved "master";
}

message PermissionAdministrationCustomPermission {
  string permission_id = 1;
  string stable_name = 2;
  string label = 3;
}

message PermissionAdministrationGrant {
  string permission_id = 1;
  bool enabled = 2;
}

message ReadPermissionAdministrationResponse {
  repeated PermissionAdministrationSystemPermission system_catalog = 1;
  repeated PermissionAdministrationGrant system_grants = 2;
  repeated PermissionAdministrationRecordType record_type_catalog = 3;
  repeated PermissionAdministrationGrant record_type_grants = 4;
  repeated PermissionAdministrationCustomPermission custom_catalog = 5;
  repeated PermissionAdministrationGrant custom_grants = 6;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 7;
}

// Identity, tenant, application installation, and administration authority
// are trusted transport facts and are intentionally absent from this request.
message MutatePermissionAdministrationRequest {
  PermissionAdministrationMutationSelector selector = 1;
  string permission_set_id = 2;
  repeated PermissionAdministrationGrant grants = 3;
  optional uint64 min_catalog_revision = 4;
}

message MutatePermissionAdministrationResponse {
  nexuscrm.common.v1.ConsistencyReceipts receipts = 1;
}
