// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.

import Foundation

@objc(SNOpenGroupServerIdLookup)
public final class OpenGroupServerIdLookup: NSObject, NSCoding {    // NSObject/NSCoding conformance is needed for YapDatabase compatibility
    @objc public let id: String
    @objc public let serverId: UInt64
    @objc public let tsMessageId: String
    
    // MARK: - Initialization
        
    @objc public init(server: String, room: String, serverId: UInt64, tsMessageId: String) {
        self.id = OpenGroupServerIdLookup.id(serverId: serverId, in: room, on: server)
        self.serverId = serverId
        self.tsMessageId = tsMessageId

        super.init()
    }

    private override init() { preconditionFailure("Use init(blindedId:sessionId:) instead.") }

    // MARK: - Coding
    
    public required init?(coder: NSCoder) {
        guard let id: String = coder.decodeObject(forKey: "id") as! String? else { return nil }
        guard let serverId: UInt64 = coder.decodeObject(forKey: "serverId") as! UInt64? else { return nil }
        guard let tsMessageId: String = coder.decodeObject(forKey: "tsMessageId") as! String? else { return nil }

        self.id = id
        self.serverId = serverId
        self.tsMessageId = tsMessageId
    }

    public func encode(with coder: NSCoder) {
        coder.encode(id, forKey: "id")
        coder.encode(serverId, forKey: "serverId")
        coder.encode(tsMessageId, forKey: "tsMessageId")
    }
    
    // MARK: - Convenience
    
    static func id(serverId: UInt64, in room: String, on server: String) -> String {
        return "\(server).\(room).\(serverId)"
    }
}