import Foundation
import Postbox

public struct SecureFileMediaResourceId: MediaResourceId {
    public let fileId: Int64
    
    public init(fileId: Int64) {
        self.fileId = fileId
    }
    
    public var uniqueId: String {
        return "telegram-secure-file-\(self.fileId)"
    }
    
    public var hashValue: Int {
        return self.fileId.hashValue
    }
    
    public func isEqual(to: MediaResourceId) -> Bool {
        if let to = to as? SecureFileMediaResourceId {
            return self.fileId == to.fileId
        } else {
            return false
        }
    }
}

public final class SecureFileMediaResource: TelegramMediaResource {
    public let file: SecureIdFileReference
    
    public var id: MediaResourceId {
        return SecureFileMediaResourceId(fileId: self.file.id)
    }
    
    public var datacenterId: Int {
        return Int(self.file.datacenterId)
    }
    
    public var size: Int? {
        return Int(self.file.size)
    }
    
    public init(file: SecureIdFileReference) {
        self.file = file
    }
    
    public required init(decoder: PostboxDecoder) {
        self.file = SecureIdFileReference(id: decoder.decodeInt64ForKey("f", orElse: 0), accessHash: decoder.decodeInt64ForKey("a", orElse: 0), size: decoder.decodeInt32ForKey("n", orElse: 0), datacenterId: decoder.decodeInt32ForKey("d", orElse: 0), timestamp: decoder.decodeInt32ForKey("t", orElse: 0), fileHash: decoder.decodeBytesForKey("h")?.makeData() ?? Data(), encryptedSecret: decoder.decodeBytesForKey("s")?.makeData() ?? Data())
    }
    
    public func encode(_ encoder: PostboxEncoder) {
        encoder.encodeInt64(self.file.id, forKey: "f")
        encoder.encodeInt64(self.file.accessHash, forKey: "a")
        encoder.encodeInt32(self.file.size, forKey: "n")
        encoder.encodeInt32(self.file.datacenterId, forKey: "d")
        encoder.encodeInt32(self.file.timestamp, forKey: "t")
        encoder.encodeBytes(MemoryBuffer(data: self.file.fileHash), forKey: "h")
        encoder.encodeBytes(MemoryBuffer(data: self.file.encryptedSecret), forKey: "s")
    }
    
    public func isEqual(to: MediaResource) -> Bool {
        if let to = to as? SecureFileMediaResource {
            return self.file == to.file
        } else {
            return false
        }
    }
}