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

service BulkIngestService {
  rpc CreateBulkIngestJob(CreateBulkIngestJobRequest) returns (CreateBulkIngestJobResponse);
  rpc ReadBulkIngestJob(ReadBulkIngestJobRequest) returns (ReadBulkIngestJobResponse);
  rpc CloseBulkIngestJob(CloseBulkIngestJobRequest) returns (CloseBulkIngestJobResponse);
  rpc UploadBulkIngestData(stream UploadBulkIngestDataRequest) returns (UploadBulkIngestDataResponse);
}

enum BulkIngestOperation {
  BULK_INGEST_OPERATION_UNSPECIFIED = 0;
  BULK_INGEST_OPERATION_INSERT = 1;
  BULK_INGEST_OPERATION_UPDATE = 2;
  BULK_INGEST_OPERATION_UPSERT = 3;
  BULK_INGEST_OPERATION_DELETE = 4;
}

enum BulkIngestState {
  BULK_INGEST_STATE_UNSPECIFIED = 0;
  BULK_INGEST_STATE_OPEN = 1;
  BULK_INGEST_STATE_UPLOAD_COMPLETE = 2;
  BULK_INGEST_STATE_IN_PROGRESS = 3;
  BULK_INGEST_STATE_COMPLETE = 4;
  BULK_INGEST_STATE_FAILED = 5;
  BULK_INGEST_STATE_ABORTED = 6;
}

enum BulkIngestFailureCode {
  BULK_INGEST_FAILURE_CODE_UNSPECIFIED = 0;
  BULK_INGEST_FAILURE_CODE_PROCESSING_FAILED = 1;
}

message BulkIngestJob {
  string id = 1;
  string object_id = 2;
  BulkIngestOperation operation = 3;
  BulkIngestState state = 4;
  string created_by_id = 5;
  string created_at = 6;
  string modified_at = 7;
  BulkIngestFailureCode failure_code = 8;
  string external_id_field_name = 9;
  uint64 number_records_processed = 10;
  uint64 number_records_failed = 11;
  uint64 total_processing_time = 12;
  uint64 active_processing_time = 13;
  double client_version = 14;
}

message CreateBulkIngestJobRequest {
  string object_id = 1;
  BulkIngestOperation operation = 2;
  string external_id_field_name = 3;
  double client_version = 4;
}

message CreateBulkIngestJobResponse {
  BulkIngestJob job = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
}

message ReadBulkIngestJobRequest { string job_id = 1; }

message ReadBulkIngestJobResponse {
  BulkIngestJob job = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
}

message CloseBulkIngestJobRequest {
  string job_id = 1;
  BulkIngestState state = 2;
}

message CloseBulkIngestJobResponse {
  BulkIngestJob job = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
}

message UploadBulkIngestDataHeader {
  string job_id = 1;
  optional uint64 content_length = 2;
}

message UploadBulkIngestDataRequest {
  oneof value {
    UploadBulkIngestDataHeader header = 1;
    bytes data = 2;
  }
}

message UploadBulkIngestDataResponse {
  string job_id = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
}
