import logging

from jinja2 import Environment, Template
import re
import xml.etree.ElementTree

from edge.opensearch.response import Response

class FgdcResponse(Response):
    def __init__(self):
        self.namespaces = {}
        self.env = Environment()
        self.env.trim_blocks = True
        self.env.autoescape = True
        self.variables = {}

    def setTemplate(self, template):
        self.template = self.env.from_string(template.replace('>\n<', '><'))

    def addNamespace(self, name, uri):
        self.namespaces[name] = uri

    def removeNamespace(self, name):
        del self.namespaces[name]

    def generate(self, pretty=False, xmlDeclaration=""):
        logging.debug('FgdcResponse.generate is called.')
        fgdcStr = self.template.render(self.variables).encode('utf-8')
        if fgdcStr != "" and pretty:
            #xmlDeclaration ="<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<!DOCTYPE metadata SYSTEM \"http://www.fgdc.gov/metadata/fgdc-std-001-1998.dtd\">\n"
            tree = xml.etree.ElementTree.fromstring(fgdcStr)
            self._indent(tree)
            
            for namespace in list(self.namespaces.keys()):
                xml.etree.ElementTree.register_namespace(namespace, self.namespaces[namespace])
            
            return xmlDeclaration + xml.etree.ElementTree.tostring(tree, encoding='utf-8')
        else:
            return fgdcStr

    # Provided by http://effbot.org/zone/element-lib.htm#prettyprint
    def _indent(self, elem, level=0):
        i = "\n" + level * "   "
        if len(elem):
            if not elem.text or not elem.text.strip():
                elem.text = i + "   "
            if not elem.tail or not elem.tail.strip():
                elem.tail = i
            for elem in elem:
                self._indent(elem, level + 1)
            if not elem.tail or not elem.tail.strip():
                elem.tail = i
        else:
            if level and (not elem.tail or not elem.tail.strip()):
                elem.tail = i
                
