# -*- coding: utf-8 -*-
# flake8: noqa
"""
hyper/compat
~~~~~~~~~~~~

Normalizes the Python 2/3 API for internal use.
"""
from contextlib import contextmanager
import sys
import zlib

try:
    from . import ssl_compat
except ImportError:
    # TODO log?
    ssl_compat = None

_ver = sys.version_info
is_py2 = _ver[0] == 2
is_py2_7_9_or_later = _ver[0] >= 2 and _ver[1] >= 7 and _ver[2] >= 9
is_py3 = _ver[0] == 3
is_py3_3 = is_py3 and _ver[1] == 3


@contextmanager
def ignore_missing():
    try:
        yield
    except (AttributeError, NotImplementedError):  # pragma: no cover
        pass

if is_py2:
    if is_py2_7_9_or_later:
        import ssl
    else:
        ssl = ssl_compat

    from urllib import urlencode
    from urlparse import urlparse, urlsplit
    from itertools import imap

    def to_byte(char):
        return ord(char)

    def decode_hex(b):
        return b.decode('hex')

    def write_to_stdout(data):
        sys.stdout.write(data + '\n')
        sys.stdout.flush()

    # The standard zlib.compressobj() accepts only positional arguments.
    def zlib_compressobj(level=6, method=zlib.DEFLATED, wbits=15, memlevel=8,
                         strategy=zlib.Z_DEFAULT_STRATEGY):
        return zlib.compressobj(level, method, wbits, memlevel, strategy)

    unicode = unicode
    bytes = str

elif is_py3:
    from urllib.parse import urlencode, urlparse, urlsplit

    imap = map

    def to_byte(char):
        return char

    def decode_hex(b):
        return bytes.fromhex(b)

    def write_to_stdout(data):
        sys.stdout.buffer.write(data + b'\n')
        sys.stdout.buffer.flush()

    zlib_compressobj = zlib.compressobj

    if is_py3_3:
        ssl = ssl_compat
    else:
        import ssl

    unicode = str
    bytes = bytes