from piston.emitters import XMLEmitter


class EuscanXMLEmitter(XMLEmitter):
    _parent = []
    _known_parents = {
        'vlog': 'version',
        'herds': 'herd',
        'maintainers': 'maintainer',
        'packaged': 'version',
        'upstream': 'version',
        'packages': 'package',
        'categories': 'category'
        }

    def _push_parent(self, parent):
        self._parent.append(parent)

    def _pop_parent(self):
        if self._parent:
            return self._parent.pop()
        else:
            return None

    def _current_parent(self):
        if self._parent:
            return self._parent[-1]
        else:
            return None

    def _name_from_parent(self):
        return self._known_parents.get(self._current_parent(), 'resource')

    def _to_xml(self, xml, data):
        def recurse(name, xml, item):
            attrs = {}
            xml.startElement(name, attrs)
            self._push_parent(name)
            self._to_xml(xml, item)
            self._pop_parent()
            xml.endElement(name)

        if isinstance(data, (list, tuple)):
            for item in data:
                name = self._name_from_parent()
                recurse(name, xml, item)
        elif isinstance(data, dict):
            for key, value in data.iteritems():
                recurse(key, xml, value)
        else:
            super(EuscanXMLEmitter, self)._to_xml(xml, data)
