import Foundation
import Postbox
        
public class DerivedDataMessageAttribute: MessageAttribute {
    private struct EntryData: PostboxCoding {
        var data: CodableEntry
        
        init(data: CodableEntry) {
            self.data = data
        }
        
        init(decoder: PostboxDecoder) {
            self.data = CodableEntry(data: decoder.decodeDataForKey("d") ?? Data())
        }
        
        func encode(_ encoder: PostboxEncoder) {
            encoder.encodeData(self.data.data, forKey: "d")
        }
    }
    
    public let data: [String: CodableEntry]

    public init(data: [String: CodableEntry]) {
        self.data = data
    }
    
    required public init(decoder: PostboxDecoder) {
        let data = decoder.decodeObjectDictionaryForKey("d", keyDecoder: { key in
            return key.decodeStringForKey("k", orElse: "")
        }, valueDecoder: { value in
            return EntryData(data: CodableEntry(data: value.decodeDataForKey("d") ?? Data()))
        })
        self.data = data.mapValues(\.data)
    }
    
    public func encode(_ encoder: PostboxEncoder) {
        encoder.encodeObjectDictionary(self.data.mapValues(EntryData.init(data:)), forKey: "d", keyEncoder: { k, e in
            e.encodeString(k, forKey: "k")
        })
    }
}