import logging
from xml.dom import minidom
from .base import SubtitleDocument, TimeBase
from ebu_tt_live import bindings
from ebu_tt_live.bindings.converters.ebutt3_ebuttd import EBUTT3EBUTTDConverter
log = logging.getLogger(__name__)
document_logger = logging.getLogger('document_logger')
[docs]class EBUTTDDocument(SubtitleDocument):
    _implicit_ns = False
    _ebuttd_content = None
    def __init__(self, lang):
        self._ebuttd_content = bindings.ttd(
            timeBase='media',
            head=bindings.d_head_type(
                styling=bindings.d_styling_type.create_default_value(),
                layout=bindings.d_layout_type.create_default_value()
            ),
            lang=lang
        )
[docs]    def set_implicit_ns(self, value):
        if not isinstance(value, bool):
            raise ValueError()
        self._implicit_ns = value 
[docs]    def validate(self):
        self._ebuttd_content.validateBinding() 
[docs]    @classmethod
    def create_from_xml(cls, xml):
        # NOTE: This is a workaround to make the bindings accept separate root element identities
        # for the same name. tt comes in but we rename it to ttd to make the xsd validate.
        xml_dom = minidom.parseString(xml)
        if xml_dom.documentElement.tagName == 'tt':
            xml_dom.documentElement.tagName = 'ttd'
        instance = cls.create_from_raw_binding(
            binding=bindings.CreateFromDOM(
                xml_dom
            )
        )
        return instance 
[docs]    @classmethod
    def create_from_raw_binding(cls, binding):
        instance = cls.__new__(cls)
        instance._ebuttd_content = binding
        return instance 
[docs]    def _get_bds(self):
        if self._implicit_ns:
            return bindings.BindingDOMSupport(
                namespace_prefix_map=bindings.namespace_prefix_map,
                default_namespace=bindings.Namespace
            )
        else:
            return bindings.BindingDOMSupport(
                namespace_prefix_map=bindings.namespace_prefix_map
            ) 
[docs]    def get_xml(self):
        return self._ebuttd_content.toxml(
            bds=self._get_bds()
        ) 
[docs]    def get_dom(self):
        return self._ebuttd_content.toDOM(
            bds=self._get_bds()
        )