import time

from tests_engine import TestTag


class term_color:
    BLUE = '\033[94m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    RED = '\033[91m'
    RESET = '\033[0m'


ROBOT_LISTENER_API_VERSION = 3

_x_start_time = {}


def decorate(text):
    indent_level = 6
    box_length = 1

    box_upper_corner = u'\u2554'.encode()
    box_horizontal_element = u'\u2550'
    box_vertical_element = u'\u2551'.encode()
    box_lower_corner = u'\u255a'.encode()

    initial_spacing = (" " * indent_level).encode()
    line_prefix = u"\n".encode() + initial_spacing + box_vertical_element + u" ".encode()
    horizontal_line = (box_horizontal_element * box_length).encode()

    return (initial_spacing + box_upper_corner + horizontal_line \
        + line_prefix \
        + line_prefix.join([x.encode() for x in text.split("\n")]) \
        + u"\n".encode() + initial_spacing + box_lower_corner + horizontal_line).decode()

def start_test(data, result):
    # we have to flush manually, as the '-u' switch that should guarantee unbuffered output does not work on Windows
    print("+++++ Starting test '{}'".format(data.longname), flush=True)
    _x_start_time[data.longname] = time.time()


def end_test(data, result):
    status = ""
    if result.passed:
        status = term_color.GREEN + 'OK' + term_color.RESET
    else:
        if TestTag.RETRIED_ATTEMPT in result.tags:
            status = term_color.YELLOW + 'failed (will be retried)' + term_color.RESET
        elif TestTag.UNSTABLE in result.tags:
            status = term_color.BLUE + 'failed (known-unstable)' + term_color.RESET
        elif result.skipped:
            status = term_color.BLUE + 'skipped' + term_color.RESET
        elif TestTag.NON_CRITICAL in result.tags:
            status = term_color.YELLOW + 'failed (non critical)' + term_color.RESET
        else:
            status = term_color.RED + 'failed' + term_color.RESET

    duration = time.time() - _x_start_time[data.longname]
    del _x_start_time[data.longname]

    print("+++++ Finished test '{0}' in {1:.2f} seconds with status {2}".format(data.longname, duration, status), flush=True)

    if not result.passed:
        print(decorate(result.message))
