# -*- coding: utf-8 -*-
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

try:
    from pygments import highlight
    from pygments.console import ansiformat
    from pygments.formatter import Formatter
    from pygments.formatters import Terminal256Formatter
    from pygments.lexer import bygroups, include, RegexLexer
    from pygments.token import *

    import sys
except ImportError, e:
    print e


MONKEY_COLORS = {
    Token:          '',
    Whitespace:     'reset',
    Text:           'reset',

    Name:           'green',
    Operator:       'teal',
    Operator.Word:  'lightgray',
    String:         'purple',

    Keyword:        '_red_',
    Error:          'red',
    Literal:        'yellow',
    Number:         'blue',
}


def get_colorscheme():
    return MONKEY_COLORS


class MonkeyLexer(RegexLexer):
    keywords = ['[a-z]*id', '^[a-z A-Z]*:']
    attributes = ['[Tt]rue', '[Ff]alse']
    params = ['[a-z]*[Nn]ame', 'type', '[Ss]tate']

    uuid_rgx = r'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
    date_rgx = r'[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9:]{8}-[0-9]{4}'

    def makelistre(lis):
        return r'(' + r'|'.join(lis) + r')'

    tokens = {
        'root': [
            (r' ', Whitespace),
            (date_rgx, Number),
            (uuid_rgx, Literal),
            (r'(?:\b\d+\b(?:-\b\d+|%)?)', Number),
            (r'^[-=]*\n', Operator.Word),
            (r'Error', Error),
            (makelistre(attributes), Literal),
            (makelistre(params) + r'( = )(.*)', bygroups(Name, Operator,
                                                         String)),
            (makelistre(keywords), Keyword),
            (makelistre(params), Name),
            (r'(^[a-zA-Z]* )(=)', bygroups(Name, Operator)),
            (r'\S+', Text),
        ]
    }

    def analyse_text(text):
        npos = text.find('\n')
        if npos < 3:
            return False
        return text[0] == '[' and text[npos - 1] == ']'


class MonkeyFormatter(Formatter):
    def __init__(self, **options):
        Formatter.__init__(self, **options)
        self.colorscheme = get_colorscheme()

    def format(self, tokensource, outfile):
        return Formatter.format(self, tokensource, outfile)

    def format_unencoded(self, tokensource, outfile):
        for ttype, value in tokensource:
            color = self.colorscheme.get(ttype)
            while color is None:
                ttype = ttype[:-1]
                color = self.colorscheme.get(ttype)
            if color:
                spl = value.split('\n')
                for line in spl[:-1]:
                    if line:
                        outfile.write(ansiformat(color, line))
                    outfile.write('\n')
                if spl[-1]:
                    outfile.write(ansiformat(color, spl[-1]))
            else:
                outfile.write(value)


def monkeyprint(text):
    fmter = MonkeyFormatter()
    lexer = MonkeyLexer()
    lexer.encoding = 'utf-8'
    fmter.encoding = 'utf-8'
    highlight(text, lexer, fmter, sys.stdout)
