// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

export interface BasePayload {
  eventId: number;
  senderId: string;
  recipientMri: string;
  groupId: string;
}

export interface MessageReceivedPayload extends BasePayload {
  messageId: string;
  clientMessageId: string;
  senderDisplayName: string;
  messageType: string;
  messageBody: string;
  version: string;
  originalArrivalTime: string;
  acsChatMessageMetadata: string;
  attachments?: string;
}

export interface MessageEditedPayload extends MessageReceivedPayload {
  edittime: string;
}

export interface MessageDeletedPayload extends BasePayload {
  messageId: string;
  clientMessageId: string;
  senderDisplayName: string;
  version: string;
  deletetime: string;
  messageType: string;
  originalArrivalTime: string;
}

export interface TypingIndicatorReceivedPayload extends BasePayload {
  version: string;
  senderDisplayName: string;
  originalArrivalTime: string;
}

export interface ReadReceiptReceivedPayload extends BasePayload {
  messageId: string;
  clientMessageId: string;
  messageBody: string;
}

export interface ReadReceiptMessageBody {
  user: string;
  consumptionhorizon: string;
  messageVisibilityTime: number;
  version: string;
}

export interface ChatThreadPayload {
  eventId: number;
  threadId: string;
  version: string;
}

export interface ChatParticipantPayload {
  participantId: string;
  displayName: string;
  shareHistoryTime?: string;
  memberMetaData?: string;
}

export interface ChatThreadPropertiesPayload {
  topic: string;
  acsChatThreadMetadata?: string;
  retentionPolicy?: string;
}

export interface ChatThreadCreatedPayload extends ChatThreadPayload {
  createTime: string;
  createdBy: string;
  members: string;
  properties: string;
}

export interface ChatThreadPropertiesUpdatedPayload extends ChatThreadPayload {
  editTime: string;
  editedBy: string;
  properties: string;
}

export interface ChatThreadDeletedPayload extends ChatThreadPayload {
  deleteTime: string;
  deletedBy?: string;
  reason?: string;
}

export interface ParticipantsAddedPayload extends ChatThreadPayload {
  time: string;
  addedBy: string;
  participantsAdded: string;
}

export interface ParticipantsRemovedPayload extends ChatThreadPayload {
  time: string;
  removedBy: string;
  participantsRemoved: string;
}
