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

// AnalyticsAuthoringService atomically authors neutral saved reports,
// dashboards (including root-only patches), and analytics-folder definitions.
// Runtime owns identity, authorization, transactions, record lifecycles and
// persistence; product routes remain L1-owned.
service AnalyticsAuthoringService {
  rpc MutateAnalyticsDefinition(MutateAnalyticsDefinitionRequest) returns (MutateAnalyticsDefinitionResponse);
}

enum AnalyticsAuthoringOperation {
  ANALYTICS_AUTHORING_OPERATION_UNSPECIFIED = 0;
  reserved 1, 2, 3, 5, 6;
  reserved "ANALYTICS_AUTHORING_OPERATION_CREATE_REPORT", "ANALYTICS_AUTHORING_OPERATION_UPDATE_REPORT", "ANALYTICS_AUTHORING_OPERATION_DELETE_REPORT", "ANALYTICS_AUTHORING_OPERATION_UPDATE_DASHBOARD", "ANALYTICS_AUTHORING_OPERATION_DELETE_DASHBOARD";
  ANALYTICS_AUTHORING_OPERATION_CREATE_DASHBOARD = 4;
  ANALYTICS_AUTHORING_OPERATION_CREATE_FOLDER = 7;
  ANALYTICS_AUTHORING_OPERATION_UPDATE_FOLDER = 8;
  ANALYTICS_AUTHORING_OPERATION_DELETE_FOLDER = 9;
  ANALYTICS_AUTHORING_OPERATION_REPLACE_DASHBOARD_DEFINITION = 10;
  ANALYTICS_AUTHORING_OPERATION_CREATE_REPORT_DEFINITION = 11;
  ANALYTICS_AUTHORING_OPERATION_UPDATE_REPORT_DEFINITION = 12;
  ANALYTICS_AUTHORING_OPERATION_DELETE_REPORT_DEFINITION = 13;
}

message MutateAnalyticsDefinitionRequest {
  AnalyticsAuthoringOperation operation = 1;
  string resource_id = 2;
  reserved 3;
  reserved "canonical_definition";
  optional uint64 min_catalog_revision = 4;
  string command_id = 5;
  AnalyticsDashboardDefinition dashboard = 6;
  AnalyticsFolderDefinition folder = 7;
  AnalyticsReportDefinition report = 8;
}

message AnalyticsReportDefinition {
  optional string name = 1;
  optional string stable_name = 2;
  optional string folder_id = 3;
  optional string description = 4;
  optional string source_object = 5;
  optional string source_ref = 6;
  optional string display_mode = 7;
  optional string scope = 8;
  AnalyticsReportColumnSet column_set = 9;
  AnalyticsReportFilterSet filter_set = 10;
  AnalyticsReportGroupingSet grouping_set = 11;
  // PATCH presence is operation-bearing: no branch leaves the stored filter
  // unchanged, date_filter sets it, and clear_date_filter removes it.
  oneof date_filter_change {
    AnalyticsReportDateFilter date_filter = 12;
    AnalyticsReportDateFilterClear clear_date_filter = 13;
  }
}

message AnalyticsReportColumnSet {
  repeated string columns = 1;
}

message AnalyticsReportFilterSet {
  repeated AnalyticsReportFilter filters = 1;
}

message AnalyticsReportFilter {
  string column = 1;
  string operator = 2;
  string value = 3;
}

message AnalyticsReportGroupingSet {
  repeated string grouping = 1;
}

message AnalyticsReportDateFilter {
  string column = 1;
  string duration_value = 2;
  string start_date = 3;
  string end_date = 4;
}

message AnalyticsReportDateFilterClear {}

message AnalyticsDashboardDefinition {
  optional string name = 1;
  optional string stable_name = 2;
  optional string folder_id = 3;
  optional string description = 4;
  optional string layout_kind = 5;
  optional string kind = 6;
  AnalyticsDashboardComponentSet component_set = 7;
}

message AnalyticsDashboardComponentSet {
  repeated AnalyticsDashboardComponent components = 1;
}

message AnalyticsDashboardComponent {
  string report_id = 1;
  string kind = 2;
  string title = 3;
  string canonical_configuration = 4;
}

enum AnalyticsFolderAccess {
  ANALYTICS_FOLDER_ACCESS_UNSPECIFIED = 0;
  ANALYTICS_FOLDER_ACCESS_HIDDEN = 1;
  ANALYTICS_FOLDER_ACCESS_SHARED = 2;
  ANALYTICS_FOLDER_ACCESS_PUBLIC = 3;
}

message AnalyticsFolderDefinition {
  optional string name = 1;
  optional string stable_name = 2;
  optional string description = 3;
  optional string kind = 4;
  optional AnalyticsFolderAccess access = 5;
  optional string parent_folder_id = 6;
}

message MutateAnalyticsDefinitionResponse {
  string resource_id = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
  string command_id = 3;
}
