from __future__ import unicode_literals

from prompt_toolkit.styles import Style, merge_styles
from prompt_toolkit.styles.pygments import style_from_pygments_cls
from prompt_toolkit.utils import is_windows, is_conemu_ansi, is_windows_vt100_supported
from pygments.styles import get_style_by_name, get_all_styles

__all__ = (
    'get_all_code_styles',
    'get_all_ui_styles',
    'generate_style',
)


def get_all_code_styles():
    """
    Return a mapping from style names to their classes.
    """
    result = dict((name, style_from_pygments_cls(get_style_by_name(name))) for name in get_all_styles())
    result['win32'] = Style.from_dict(win32_code_style)
    return result


def get_all_ui_styles():
    """
    Return a dict mapping {ui_style_name -> style_dict}.
    """
    return {
        'default': Style.from_dict(default_ui_style),
        'blue': Style.from_dict(blue_ui_style),
    }


def generate_style(python_style, ui_style):
    """
    Generate Pygments Style class from two dictionaries
    containing style rules.
    """
    return merge_styles([
        python_style,
        ui_style
    ])


# Code style for Windows consoles. They support only 16 colors,
# so we choose a combination that displays nicely.
win32_code_style = {
    'pygments.comment':                   "#00ff00",
    'pygments.keyword':                   '#44ff44',
    'pygments.number':                    '',
    'pygments.operator':                  '',
    'pygments.string':                    '#ff44ff',

    'pygments.name':                      '',
    'pygments.name.decorator':            '#ff4444',
    'pygments.name.class':                '#ff4444',
    'pygments.name.function':             '#ff4444',
    'pygments.name.builtin':              '#ff4444',

    'pygments.name.attribute':            '',
    'pygments.name.constant':             '',
    'pygments.name.entity':               '',
    'pygments.name.exception':            '',
    'pygments.name.label':                '',
    'pygments.name.namespace':            '',
    'pygments.name.tag':                  '',
    'pygments.name.variable':             '',
}


default_ui_style = {
    'control-character':    'ansiblue',

    # Classic prompt.
    'prompt':                                 'bold',
    'prompt.dots':                            'noinherit',

    # (IPython <5.0) Prompt: "In [1]:"
    'in':                                     'bold #008800',
    'in.number':                              '',

    # Return value.
    'out':                                    '#ff0000',
    'out.number':                             '#ff0000',

    # Separator between windows. (Used above docstring.)
    'separator':                              '#bbbbbb',

    # System toolbar
    'system-toolbar':                         '#22aaaa noinherit',

    # "arg" toolbar.
    'arg-toolbar':                            '#22aaaa noinherit',
    'arg-toolbar.text':                       'noinherit',

    # Signature toolbar.
    'signature-toolbar':                      'bg:#44bbbb #000000',
    'signature-toolbar.currentname':          'bg:#008888 #ffffff bold',
    'signature-toolbar.operator':             '#000000 bold',

    'docstring':                              '#888888',

    # Validation toolbar.
    'validation-toolbar':                     'bg:#440000 #aaaaaa',

    # Status toolbar.
    'status-toolbar':                         'bg:#222222 #aaaaaa',
    'status-toolbar.title':                   'underline',
    'status-toolbar.inputmode':               'bg:#222222 #ffffaa',
    'status-toolbar.key':                     'bg:#000000 #888888',
    'status-toolbar.pastemodeon':             'bg:#aa4444 #ffffff',
    'status-toolbar.pythonversion':           'bg:#222222 #ffffff bold',
    'status-toolbar paste-mode-on':           'bg:#aa4444 #ffffff',
    'record':                                 'bg:#884444 white',
    'status-toolbar.input-mode':              '#ffff44',

    # The options sidebar.
    'sidebar':                                'bg:#bbbbbb #000000',
    'sidebar.title':                          'bg:#668866 #ffffff',
    'sidebar.label':                          'bg:#bbbbbb #222222',
    'sidebar.status':                         'bg:#dddddd #000011',
    'sidebar.label selected':                 'bg:#222222 #eeeeee',
    'sidebar.status selected':                'bg:#444444 #ffffff bold',

    'sidebar.separator':                      'underline',
    'sidebar.key':                            'bg:#bbddbb #000000 bold',
    'sidebar.key.description':                'bg:#bbbbbb #000000',
    'sidebar.helptext':                       'bg:#fdf6e3 #000011',

#        # Styling for the history layout.
#        history.line:                          '',
#        history.line.selected:                 'bg:#008800  #000000',
#        history.line.current:                  'bg:#ffffff #000000',
#        history.line.selected.current:         'bg:#88ff88 #000000',
#        history.existinginput:                  '#888888',

    # Help Window.
    'window-border':                          '#aaaaaa',
    'window-title':                           'bg:#bbbbbb #000000',

    # Meta-enter message.
    'accept-message':                          'bg:#ffff88 #444444',

    # Exit confirmation.
    'exit-confirmation':                       'bg:#884444 #ffffff',
}


# Some changes to get a bit more contrast on Windows consoles.
# (They only support 16 colors.)
if is_windows() and not is_conemu_ansi() and not is_windows_vt100_supported():
    default_ui_style.update({
        'sidebar.title':                          'bg:#00ff00 #ffffff',
        'exitconfirmation':                       'bg:#ff4444 #ffffff',
        'toolbar.validation':                     'bg:#ff4444 #ffffff',

        'menu.completions.completion':            'bg:#ffffff #000000',
        'menu.completions.completion.current':    'bg:#aaaaaa #000000',
    })


blue_ui_style = {}
blue_ui_style.update(default_ui_style)
#blue_ui_style.update({
#        # Line numbers.
#        Token.LineNumber:                             '#aa6666',
#
#        # Highlighting of search matches in document.
#        Token.SearchMatch:                            '#ffffff bg:#4444aa',
#        Token.SearchMatch.Current:                    '#ffffff bg:#44aa44',
#
#        # Highlighting of select text in document.
#        Token.SelectedText:                           '#ffffff bg:#6666aa',
#
#        # Completer toolbar.
#        Token.Toolbar.Completions:                    'bg:#44bbbb #000000',
#        Token.Toolbar.Completions.Arrow:              'bg:#44bbbb #000000 bold',
#        Token.Toolbar.Completions.Completion:         'bg:#44bbbb #000000',
#        Token.Toolbar.Completions.Completion.Current: 'bg:#008888 #ffffff',
#
#        # Completer menu.
#        Token.Menu.Completions.Completion:            'bg:#44bbbb #000000',
#        Token.Menu.Completions.Completion.Current:    'bg:#008888 #ffffff',
#        Token.Menu.Completions.Meta:                  'bg:#449999 #000000',
#        Token.Menu.Completions.Meta.Current:          'bg:#00aaaa #000000',
#        Token.Menu.Completions.ProgressBar:           'bg:#aaaaaa',
#        Token.Menu.Completions.ProgressButton:        'bg:#000000',
#})
