syntax = "proto3";

package rocketmq;
option go_package = "./proto";

// RocketMQ代理服务
service RocketMQProxy {
  // 创建生产者
  rpc CreateProducer(CreateProducerRequest) returns (CreateProducerResponse);
  
  // 发送普通消息
  rpc SendMessage(SendMessageRequest) returns (SendMessageResponse);
  
  // 发送顺序消息
  rpc SendOrderedMessage(SendOrderedMessageRequest) returns (SendMessageResponse);
  
  // 发送延迟消息
  rpc SendDelayMessage(SendDelayMessageRequest) returns (SendMessageResponse);
  
  // 发送事务消息
  rpc SendTransactionMessage(SendTransactionMessageRequest) returns (SendTransactionMessageResponse);
  
  // 创建消费者
  rpc CreateConsumer(CreateConsumerRequest) returns (CreateConsumerResponse);
  
  // 接收消息 (流式)
  rpc ReceiveMessages(ReceiveMessagesRequest) returns (stream Message);
  
  // 确认消息
  rpc AckMessage(AckMessageRequest) returns (AckMessageResponse);
  
  // 清理生产者
  rpc CleanupProducer(CleanupProducerRequest) returns (CleanupProducerResponse);
  
  // 清理消费者
  rpc CleanupConsumer(CleanupConsumerRequest) returns (CleanupConsumerResponse);
  
  // 健康检查
  rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
}

// 创建生产者请求
message CreateProducerRequest {
  string endpoint = 1;
  string access_key_id = 2;
  string access_key_secret = 3;
  string instance_id = 4;
  string topic = 5;
}

// 创建生产者响应
message CreateProducerResponse {
  bool success = 1;
  string message = 2;
  string producer_id = 3;
}

// 消息属性
message MessageProperties {
  map<string, string> properties = 1;  // 自定义属性
  string message_key = 2;              // 消息Key
  string sharding_key = 3;             // 分区键(顺序消息)
  int64 start_deliver_time = 4;        // 延时投递时间(毫秒时间戳)
  int32 trans_check_immunity_time = 5; // 事务消息回查免疫时间(秒)
}

// 发送消息请求
message SendMessageRequest {
  string producer_id = 1;
  string message_body = 2;  // JSON字符串或普通字符串
  string tag = 3;
  MessageProperties properties = 4;
}

// 发送消息响应
message SendMessageResponse {
  bool success = 1;
  string message = 2;
  string message_id = 3;
  string receipt_handle = 4;
}

// 创建消费者请求
message CreateConsumerRequest {
  string endpoint = 1;
  string access_key_id = 2;
  string access_key_secret = 3;
  string instance_id = 4;
  string topic = 5;
  string group_id = 6;
  string tag_expression = 7;  // 如: "tag1||tag2"
}

// 创建消费者响应
message CreateConsumerResponse {
  bool success = 1;
  string message = 2;
  string consumer_id = 3;
}

// 接收消息请求
message ReceiveMessagesRequest {
  string consumer_id = 1;
}

// 消息
message Message {
  string message_id = 1;
  string receipt_handle = 2;
  string message_body = 3;
  string tag = 4;
  map<string, string> properties = 5;
  int64 born_timestamp = 6;
  int32 reconsume_times = 7;
}

// 确认消息请求
message AckMessageRequest {
  string consumer_id = 1;
  string receipt_handle = 2;
}

// 确认消息响应
message AckMessageResponse {
  bool success = 1;
  string message = 2;
}

// 清理生产者请求
message CleanupProducerRequest {
  string producer_id = 1;    // 生产者ID
  string topic = 2;          // 或者通过主题清理
  string endpoint = 3;       // 配合主题使用
}

// 清理生产者响应
message CleanupProducerResponse {
  bool success = 1;
  string message = 2;
  int32 cleaned_count = 3;   // 清理的生产者数量
}

// 清理消费者请求
message CleanupConsumerRequest {
  string consumer_id = 1;    // 消费者ID
  string group_id = 2;       // 或者通过组名清理
  string topic = 3;          // 配合组名使用
}

// 清理消费者响应
message CleanupConsumerResponse {
  bool success = 1;
  string message = 2;
  int32 cleaned_count = 3;   // 清理的消费者数量
}

// 健康检查请求
message HealthCheckRequest {}

message HealthCheckResponse {
  bool healthy = 1;
  string message = 2;
}

// 发送顺序消息请求
message SendOrderedMessageRequest {
  string producer_id = 1;
  string message_body = 2;
  string tag = 3;
  MessageProperties properties = 4;
  string sharding_key = 5;  // 分区键，用于顺序消息
}

// 发送延迟消息请求  
message SendDelayMessageRequest {
  string producer_id = 1;
  string message_body = 2;
  string tag = 3;
  MessageProperties properties = 4;
  int64 delay_time_level = 5;  // 延迟等级 1-18
  int64 start_deliver_time = 6; // 延迟投递时间戳（毫秒）
}

// 发送事务消息请求
message SendTransactionMessageRequest {
  string producer_id = 1;
  string message_body = 2;
  string tag = 3;
  MessageProperties properties = 4;
  int32 trans_check_immunity_time = 5; // 事务回查免疫时间（秒）
}

// 事务消息响应
message SendTransactionMessageResponse {
  bool success = 1;
  string message = 2;
  string message_id = 3;
  string receipt_handle = 4;
  string transaction_id = 5; // 事务ID
} 