# -*- coding: utf-8 -*-
"""Utilities for Halo library.
"""
import codecs
import platform
import six
try:
    from shutil import get_terminal_size
except ImportError:
    from backports.shutil_get_terminal_size import get_terminal_size

from colorama import init
from termcolor import colored

init(autoreset=True)


def is_supported():
    """Check whether operating system supports main symbols or not.

    Returns
    -------
    boolean
        Whether operating system supports main symbols or not
    """

    os_arch = platform.system()

    if os_arch != 'Windows':
        return True

    return False


def get_environment():
    """Get the environment in which halo is running

    Returns
    -------
    str
        Environment name
    """
    try:
        from IPython import get_ipython
    except ImportError:
        return 'terminal'

    try:
        shell = get_ipython().__class__.__name__

        if shell == 'ZMQInteractiveShell':  # Jupyter notebook or qtconsole
            return 'jupyter'
        elif shell == 'TerminalInteractiveShell':  # Terminal running IPython
            return 'ipython'
        else:
            return 'terminal'  # Other type (?)

    except NameError:
        return 'terminal'


def colored_frame(frame, color):
    """Color the frame with given color and returns.

    Parameters
    ----------
    frame : str
        Frame to be colored
    color : str
        Color to be applied

    Returns
    -------
    str
        Colored frame
    """
    return colored(frame, color, attrs=['bold'])


def is_text_type(text):
    """Check if given parameter is a string or not

    Parameters
    ----------
    text : *
        Parameter to be checked for text type

    Returns
    -------
    bool
        Whether parameter is a string or not
    """
    if isinstance(text, six.text_type) or isinstance(text, six.string_types):
        return True

    return False


def decode_utf_8_text(text):
    """Decode the text from utf-8 format

    Parameters
    ----------
    text : str
        String to be decoded

    Returns
    -------
    str
        Decoded string
    """
    try:
        return codecs.decode(text, 'utf-8')
    except (TypeError, ValueError):
        return text


def encode_utf_8_text(text):
    """Encodes the text to utf-8 format

    Parameters
    ----------
    text : str
        String to be encoded

    Returns
    -------
    str
        Encoded string
    """
    try:
        return codecs.encode(text, 'utf-8', 'ignore')
    except (TypeError, ValueError):
        return text


def get_terminal_columns():
    """Determine the amount of available columns in the terminal

    Returns
    -------
    int
        Terminal width
    """
    terminal_size = get_terminal_size()

    # If column size is 0 either we are not connected
    # to a terminal or something else went wrong. Fallback to 80.
    if terminal_size.columns == 0:
        return 80
    else:
        return terminal_size.columns
