syntax = "proto3";

package chat;

service ChatService {
  rpc ListRooms (ListRoomsRequest) returns (ListRoomsResponse);
  rpc CreateRoom (CreateRoomRequest) returns (ChatRoomResponse);
  rpc CreateE2ERoom (CreateE2ERoomRequest) returns (ChatRoomResponse);
  rpc UpdateRoomSettings (UpdateRoomSettingsRequest) returns (ChatRoomResponse);
  rpc AddRoomMember (AddRoomMemberRequest) returns (ChatRoomResponse);
  rpc RemoveRoomMember (RemoveRoomMemberRequest) returns (ChatRoomResponse);
  rpc ListMessages (ListMessagesRequest) returns (ListMessagesResponse);
  rpc SendMessage (SendMessageRequest) returns (ChatMessageResponse);
  rpc EditMessage (EditMessageRequest) returns (ChatMessageResponse);
  rpc DeleteMessage (DeleteMessageRequest) returns (ChatMessageResponse);
  rpc SetMessagePinned (SetMessagePinnedRequest) returns (ChatMessageResponse);
  rpc MarkRoomRead (MarkRoomReadRequest) returns (MutationResponse);
  rpc VotePoll (VotePollRequest) returns (ChatMessageResponse);
  rpc SetRoomNotificationsMuted (SetRoomNotificationsMutedRequest) returns (MutationResponse);
  rpc DeleteRoom (DeleteRoomRequest) returns (MutationResponse);
  rpc ToggleMessageReaction (ToggleMessageReactionRequest) returns (ChatMessageResponse);
  rpc ForwardMessages (ForwardMessagesRequest) returns (ForwardMessagesResponse);
  rpc ReportTyping (ReportTypingRequest) returns (MutationResponse);
}

message ListRoomsRequest {
  string userId = 1;
  string groupId = 2;
}

message CreateRoomRequest {
  string userId = 1;
  string groupId = 2;
  string name = 3;
  repeated string memberUserIds = 4;
}

message CreateE2ERoomRequest {
  string userId = 1;
  string groupId = 2;
  string peerUserId = 3;
}

message UpdateRoomSettingsRequest {
  string userId = 1;
  string roomId = 2;
  optional string name = 3;
  optional bool notificationsMuted = 4;
  optional bool pinned = 5;
}

message AddRoomMemberRequest {
  string userId = 1;
  string roomId = 2;
  string memberUserId = 3;
}

message RemoveRoomMemberRequest {
  string userId = 1;
  string roomId = 2;
  string memberUserId = 3;
}

message ListMessagesRequest {
  string userId = 1;
  string roomId = 2;
  optional string beforeMessageId = 3;
  int32 limit = 4;
}

message SendMessageRequest {
  string userId = 1;
  string roomId = 2;
  string type = 3;
  optional string content = 4;
  optional string replyToId = 5;
  optional string storageKey = 6;
  optional string mimeType = 7;
  optional string metadataJson = 8;
  optional PollPayload poll = 9;
  optional bool isEncrypted = 10;
}

message EditMessageRequest {
  string userId = 1;
  string messageId = 2;
  string content = 3;
}

message DeleteMessageRequest {
  string userId = 1;
  string messageId = 2;
}

message SetMessagePinnedRequest {
  string userId = 1;
  string messageId = 2;
  bool pinned = 3;
}

message MarkRoomReadRequest {
  string userId = 1;
  string roomId = 2;
  optional string lastMessageId = 3;
}

message PollPayload {
  string question = 1;
  repeated string options = 2;
  bool allowsMultiple = 3;
  bool isAnonymous = 4;
}

message VotePollRequest {
  string userId = 1;
  string messageId = 2;
  repeated string optionIds = 3;
}

message SetRoomNotificationsMutedRequest {
  string userId = 1;
  string roomId = 2;
  bool muted = 3;
}

message DeleteRoomRequest {
  string userId = 1;
  string roomId = 2;
}

message ToggleMessageReactionRequest {
  string userId = 1;
  string messageId = 2;
  string emoji = 3;
}

message ForwardMessagesRequest {
  string userId = 1;
  string targetRoomId = 2;
  repeated string messageIds = 3;
}

message ReportTypingRequest {
  string userId = 1;
  string roomId = 2;
}

message ForwardMessagesResponse {
  repeated ChatMessageResponse messages = 1;
}

message ChatRoomMemberResponse {
  string id = 1;
  string userId = 2;
  string displayName = 3;
  bool hasAvatar = 4;
  bool notificationsMuted = 5;
  string familyRole = 6;
  bool isChatCreator = 7;
  bool isPinned = 8;
  optional string pinnedAt = 9;
}

message ChatRoomResponse {
  string id = 1;
  string groupId = 2;
  string type = 3;
  string name = 4;
  bool hasAvatar = 5;
  string updatedAt = 6;
  repeated ChatRoomMemberResponse members = 7;
  optional ChatMessageResponse lastMessage = 8;
  optional string createdById = 9;
  optional string peerUserId = 10;
  optional string botUsername = 11;
  optional bool isE2E = 12;
  bool isPinned = 13;
  optional string pinnedAt = 14;
}

message PollOptionResponse {
  string id = 1;
  string text = 2;
  int32 voteCount = 3;
  bool votedByMe = 4;
}

message PollResponse {
  string id = 1;
  string question = 2;
  bool allowsMultiple = 3;
  bool isAnonymous = 4;
  optional string closedAt = 5;
  repeated PollOptionResponse options = 6;
}

message ChatMessageResponse {
  string id = 1;
  string roomId = 2;
  string senderId = 3;
  string senderName = 4;
  bool senderHasAvatar = 5;
  bool senderIsVerified = 17;
  optional string senderVerificationIcon = 18;
  string type = 6;
  optional string content = 7;
  optional string replyToId = 8;
  optional string storageKey = 9;
  optional string mimeType = 10;
  optional string metadataJson = 11;
  string createdAt = 12;
  optional PollResponse poll = 13;
  optional string editedAt = 14;
  bool isDeleted = 15;
  optional bool readByAll = 16;
  optional bool isEncrypted = 19;
  repeated MessageReactionResponse reactions = 20;
  bool isPinned = 21;
  optional string pinnedAt = 22;
  optional string pinnedById = 23;
}

message MessageReactionResponse {
  string emoji = 1;
  int32 count = 2;
  bool reactedByMe = 3;
}

message ListRoomsResponse {
  repeated ChatRoomResponse rooms = 1;
}

message ListMessagesResponse {
  repeated ChatMessageResponse messages = 1;
}

message MutationResponse {
  int32 count = 1;
}
