"""
mbed SDK
Copyright (c) 2011-2015 ARM Limited

Licensed 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.

Author: Przemyslaw Wirkus <Przemyslaw.Wirkus@arm.com>
"""

import sys
from threading import Lock

try:
    import colorama
except ImportError:
    pass

# We will check if import actually was successful
COLORAMA = 'colorama' in sys.modules


class GreenTeaSimpleLockLogger:
    """! Simple locking printing mechanism
    @details We are using parallel testing
    """
    # Colors used by color(ama) terminal component
    DIM = str()
    BRIGHT = str()
    GREEN = str()
    RED = str()
    BLUE = str()
    YELLOW = str()
    RESET = str()

    def __init__(self, colors=True, use_colorama=False):
        self.use_colorama = colorama    # Should we try to use colorama
        self.colorful(colors)           # Set and use colours for formatting

        # Mutext used to protect logger prints
        # Usage:
        # GREENTEA_LOG_MUTEX.acquire(1)
        # GREENTEA_LOG_MUTEX.release()
        self.GREENTEA_LOG_MUTEX = Lock()

        if self.colors:
            if not self.use_colorama:
                self.gt_log("Colorful console output is disabled")
            else:
                colorama.init()

    def colorful(self, colors):
        """! Enable/Disable colourful printing
        """
        self.colors = colors
        if self.colors:
            self.__set_colors()
        else:
            self.__clear_colors()

    def __set_colors(self):
        """! Zeroes colours used for formatting
        """
        if self.use_colorama:
            self.DIM = colorama.Style.DIM
            self.BRIGHT = colorama.Style.BRIGHT
            self.GREEN = colorama.Fore.GREEN
            self.RED = colorama.Fore.RED
            self.BLUE = colorama.Fore.BLUE
            self.YELLOW = colorama.Fore.YELLOW
            self.RESET = colorama.Style.RESET_ALL

    def __clear_colors(self):
        """! Zeroes colours used for formatting
        """
        self.DIM = str()
        self.BRIGHT = str()
        self.GREEN = str()
        self.RED = str()
        self.BLUE = str()
        self.YELLOW = str()
        self.RESET =  str()

    def __print(self, text):
        """! Mutex protected print
        """
        self.GREENTEA_LOG_MUTEX.acquire(1)
        print text
        self.GREENTEA_LOG_MUTEX.release()

    def gt_log(self, text, print_text=True):
        """! Prints standard log message (in colour if colorama is installed)
        @param print_text Forces log function to print on screen (not only return message)
        @return Returns string with message
        """
        result = self.GREEN + self.BRIGHT + "mbedgt: " + self.RESET + text
        if print_text:
            self.__print(result)
        return result

    def gt_log_tab(self, text, tab_count=1, print_text=True):
        """! Prints standard log message with one (1) tab margin on the left
        @param tab_count How many tags should be added (indent level)
        @param print_text Forces log function to print on screen (not only return message)
        @return Returns string with message
        """
        result = "\t"*tab_count + text
        if print_text:
            self.__print(result)
        return result

    def gt_log_err(self, text, print_text=True):
        """! Prints error log message (in color if colorama is installed)
        @param print_text Forces log function to print on screen (not only return message)
        @return Returns string with message
        """
        result = self.RED + self.BRIGHT + "mbedgt: " + self.RESET + text
        if print_text:
            self.__print(result)
        return result

    def gt_log_warn(self, text, print_text=True):
        """! Prints error log message (in color if colorama is installed)
        @param print_text Forces log function to print on screen (not only return message)
        @return Returns string with message
        """
        result = self.YELLOW + "mbedgt: " + self.RESET + text
        if print_text:
            self.__print(result)
        return result

    def gt_bright(self, text):
        """! Created bright text using colorama
        @return Returns string with additional BRIGHT color codes
        """
        if not text:
            text = ''
        return self.BLUE + self.BRIGHT + text + self.RESET

gt_logger = GreenTeaSimpleLockLogger(use_colorama=COLORAMA)
