module plist.types.data;
import plist.types.element;
import std.base64;

class PlistElementData : PlistElement {
    void instantiate(DOMEntity!string entity) {
        _entity = entity;
        if (entity.type == EntityType.elementEmpty) 
            return;
        if (entity.children.length != 1)
            return;
        if (entity.children[0].type == EntityType.text) {
            auto encoded = entity.children[0].text;
            if (encoded.length != 0) 
                _data = Base64.decode(encoded); 
        }
    }

    @property ubyte[] value() {
        return _data;
    }

    @property ubyte[] value(ubyte[] newData) {
        _data = newData.dup;
        return newData;
    }

    override string toString() {
        import std.format : format;
        return format!"<PlistElementData data: %s>"(_data);
    }

    string type() {
        return PlistElementType.PLIST_ELEMENT_DATA;
    }

    void write(ref XMLWriter!(Appender!string) writer) {
        writer.openStartTag("data");
        if (_data.length == 0) {
            writer.closeStartTag(EmptyTag.yes);
        } else {
            writer.closeStartTag();
            writer.writeText(Base64.encode(_data), Newline.no);
            writer.writeEndTag("data", Newline.no);
        }
    }

    private {
        DOMEntity!string _entity;
        ubyte[] _data;
    }
}