/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 **/

syntax = "proto3";

package tmb.internal.net;

// Common TMB message types:
message TaggedTmbMessage {
  uint32 message_type = 1;
  bytes message_body = 2;
}

message AnnotatedTmbMessage {
  TaggedTmbMessage tagged_message = 1;
  uint32 sender = 2;
  uint64 send_time = 3;  // Nanoseconds since epoch.
  int64 message_id = 4;
}

// Multipurpose request/response messages:
message EmptyMessage {
}

message BoolStatus {
  bool status = 1;
}

// Connect()
message ConnectResponse {
  uint32 client = 1;
}

// Disconnect()
message DisconnectRequest {
  uint32 client = 1;
}

// RegisterClientAsSender()/RegisterClientAsReceiver()
message RegistrationRequest {
  uint32 client = 1;
  uint32 message_type = 2;
}

// Send()
message SendRequest {
  uint32 sender = 1;

  // Address:
  bool send_to_all = 2;
  repeated uint32 explicit_recipient = 3;

  // Style:
  bool broadcast = 4;
  uint64 timeout = 5;  // Nanoseconds since epoch.

  TaggedTmbMessage msg = 6;

  uint32 priority = 7;
  bool cancellable = 8;
}

message SendResponse {
  enum Status {
    OK = 0;
    NO_RECEIVERS = 1;
    SENDER_NOT_CONNECTED = 2;
    SENDER_NOT_REGISTERED_FOR_MESSAGE_TYPE = 3;
    RECEIVER_NOT_REGISTERED_FOR_MESSAGE_TYPE = 4;
  }

  Status status = 1;
  int64 message_id = 2;
}

// Various forms of Receive()
message ReceiveRequest {
  uint32 receiver = 1;
  uint32 minimum_priority = 2;
  uint64 maximum_messages = 3;
  bool delete_immediately = 4;
}

// DeleteMessages()/CancelMessages()
message DeleteOrCancelRequest {
  uint32 client = 1;
  repeated int64 message_id = 2;
}

// CountQueuedMessagesForClient()
message CountQueuedMessagesRequest {
  uint32 client = 1;
}

message CountQueuedMessagesResponse {
  uint64 message_count = 1;
}

// TMB service description.
service MessageBus {
  rpc ResetBus (EmptyMessage) returns (EmptyMessage) {}
  rpc Connect (EmptyMessage) returns (ConnectResponse) {}
  rpc Disconnect (DisconnectRequest) returns (BoolStatus) {}
  rpc RegisterClientAsSender (RegistrationRequest) returns (BoolStatus) {}
  rpc RegisterClientAsReceiver (RegistrationRequest) returns (BoolStatus) {}
  rpc Send (SendRequest) returns (SendResponse) {}
  // TODO(chasseur): Look into doing server-side blocking version of Receive()
  // to avoid client-side polling.
  rpc Receive (ReceiveRequest) returns (stream AnnotatedTmbMessage) {}
  rpc Delete (DeleteOrCancelRequest) returns (EmptyMessage) {}
  rpc SenderCancel (DeleteOrCancelRequest) returns (EmptyMessage) {}
  rpc ReceiverCancel (DeleteOrCancelRequest) returns (EmptyMessage) {}
  rpc CountQueuedMessages (CountQueuedMessagesRequest)
      returns (CountQueuedMessagesResponse) {}
}
