import Foundation
import Postbox

public class ReplyThreadMessageAttribute: MessageAttribute {
    public let count: Int32
    public let latestUsers: [PeerId]
    public let commentsPeerId: PeerId?
    public let maxMessageId: MessageId.Id?
    public let maxReadMessageId: MessageId.Id?
    
    public var associatedPeerIds: [PeerId] {
        return self.latestUsers
    }
    
    public init(count: Int32, latestUsers: [PeerId], commentsPeerId: PeerId?, maxMessageId: MessageId.Id?, maxReadMessageId: MessageId.Id?) {
        self.count = count
        self.latestUsers = latestUsers
        self.commentsPeerId = commentsPeerId
        self.maxMessageId = maxMessageId
        self.maxReadMessageId = maxReadMessageId
    }
    
    required public init(decoder: PostboxDecoder) {
        self.count = decoder.decodeInt32ForKey("c", orElse: 0)
        self.latestUsers = decoder.decodeInt64ArrayForKey("u").map(PeerId.init)
        self.commentsPeerId = decoder.decodeOptionalInt64ForKey("cp").flatMap(PeerId.init)
        self.maxMessageId = decoder.decodeOptionalInt32ForKey("mm")
        self.maxReadMessageId = decoder.decodeOptionalInt32ForKey("mrm")
    }
    
    public func encode(_ encoder: PostboxEncoder) {
        encoder.encodeInt32(self.count, forKey: "c")
        encoder.encodeInt64Array(self.latestUsers.map { $0.toInt64() }, forKey: "u")
        if let commentsPeerId = self.commentsPeerId {
            encoder.encodeInt64(commentsPeerId.toInt64(), forKey: "cp")
        } else {
            encoder.encodeNil(forKey: "cp")
        }
        if let maxMessageId = self.maxMessageId {
            encoder.encodeInt32(maxMessageId, forKey: "mm")
        } else {
            encoder.encodeNil(forKey: "mm")
        }
        if let maxReadMessageId = self.maxReadMessageId {
            encoder.encodeInt32(maxReadMessageId, forKey: "mrm")
        } else {
            encoder.encodeNil(forKey: "mrm")
        }
    }
}