import Foundation

public struct Message: Equatable {
  public init(
    messageType: Int,
    id: Data,
    payload: Data,
    sender: Data,
    recipientId: Data,
    ephemeralId: Int,
    timestamp: Int,
    encrypted: Bool,
    roundId: Int
  ) {
    self.messageType = messageType
    self.id = id
    self.payload = payload
    self.sender = sender
    self.recipientId = recipientId
    self.ephemeralId = ephemeralId
    self.timestamp = timestamp
    self.encrypted = encrypted
    self.roundId = roundId
  }

  public var messageType: Int
  public var id: Data
  public var payload: Data
  public var sender: Data
  public var recipientId: Data
  public var ephemeralId: Int
  public var timestamp: Int
  public var encrypted: Bool
  public var roundId: Int
}

extension Message: Codable {
  enum CodingKeys: String, CodingKey {
    case messageType = "MessageType"
    case id = "ID"
    case payload = "Payload"
    case sender = "Sender"
    case recipientId = "RecipientID"
    case ephemeralId = "EphemeralID"
    case timestamp = "Timestamp"
    case encrypted = "Encrypted"
    case roundId = "RoundId"
  }

  public static func decode(_ data: Data) throws -> Self {
    try JSONDecoder().decode(Self.self, from: data)
  }

  public func encode() throws -> Data {
    try JSONEncoder().encode(self)
  }
}