from Products.CMFCore.utils import getToolByName
from Products.CMFDiffTool.interfaces import IDiffTool
from Products.GenericSetup.utils import exportObjects
from Products.GenericSetup.utils import importObjects
from Products.GenericSetup.utils import XMLAdapterBase
from zope.interface import implementer


@implementer(IDiffTool)
class DiffToolXMLAdapter(XMLAdapterBase):
    """In- and exporter for DiffTool."""

    name = "diff_tool"

    def _exportNode(self):
        """Export the object as a DOM node."""
        node = self._doc.createElement("object")
        node.appendChild(self._extractDiffToolSettings())

        self._logger.info("DiffTool settings exported.")
        return node

    def _importNode(self, node):
        if self.environ.shouldPurge():
            self._purgeDiffToolSettings()

        self._initDiffToolSettings(node)
        self._logger.info("DiffTool settings imported.")

    def _purgeDiffToolSettings(self):
        self.context.manage_editDiffFields({})

    def _initDiffToolSettings(self, node):
        for child in node.childNodes:
            if child.nodeName == "difftypes":
                for type_entry in child.getElementsByTagName("type"):
                    ptype = type_entry.getAttribute("portal_type")
                    fields = {}
                    for field in type_entry.getElementsByTagName("field"):
                        name = field.getAttribute("name")
                        diff = field.getAttribute("difftype")
                        fields[name] = diff
                        self.context.setDiffForPortalType(ptype, fields)

    def _extractDiffToolSettings(self):
        node = self._doc.createElement("difftypes")
        ttool = getToolByName(self.context, "portal_types")
        for ptype in ttool.listContentTypes():
            diffs = self.context.getDiffForPortalType(ptype)
            if diffs:
                child = self._doc.createElement("type")
                child.setAttribute("portal_type", ptype)
                node.appendChild(child)
            for field_name, diff in diffs.items():
                field = self._doc.createElement("field")
                field.setAttribute("name", field_name)
                field.setAttribute("difftype", diff)
                child.appendChild(field)
        return node


def importDiffTool(context):
    """Import Factory Tool configuration."""
    site = context.getSite()
    tool = getToolByName(site, "portal_diff", None)

    if tool is not None:
        importObjects(tool, "", context)


def exportDiffTool(context):
    """Export Factory Tool configuration."""
    site = context.getSite()
    tool = getToolByName(site, "portal_diff", None)
    if tool is None:
        logger = context.getLogger("difftool")
        logger.info("Nothing to export.")
        return

    exportObjects(tool, "", context)
