"""
    zeep.wsdl.utils
    ~~~~~~~~~~~~~~~

"""
from lxml import etree
from six.moves.urllib.parse import urlparse, urlunparse

from zeep.utils import detect_soap_env


def get_or_create_header(envelope):
    soap_env = detect_soap_env(envelope)

    # look for the Header element and create it if not found
    header_qname = '{%s}Header' % soap_env
    header = envelope.find(header_qname)
    if header is None:
        header = etree.Element(header_qname)
        envelope.insert(0, header)
    return header


def etree_to_string(node):
    return etree.tostring(
        node, pretty_print=False, xml_declaration=True, encoding='utf-8')


def url_http_to_https(value):
    parts = urlparse(value)
    if parts.scheme != 'http':
        return value

    # Check if the url contains ':80' and remove it if that is the case
    netloc_parts = parts.netloc.rsplit(':', 1)
    if len(netloc_parts) == 2 and netloc_parts[1] == '80':
        netloc = netloc_parts[0]
    else:
        netloc = parts.netloc
    return urlunparse(('https', netloc) + parts[2:])
