#!/usr/bin/env python2.7

# Copyright 2014, ARM Limited
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#   * Redistributions of source code must retain the above copyright notice,
#     this list of conditions and the following disclaimer.
#   * Redistributions in binary form must reproduce the above copyright notice,
#     this list of conditions and the following disclaimer in the documentation
#     and/or other materials provided with the distribution.
#   * Neither the name of ARM Limited nor the names of its contributors may be
#     used to endorse or promote products derived from this software without
#     specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


import sys
import time
import multiprocessing

output_redirected_to_file = not sys.stdout.isatty()

def ColourCode(colour):
  return '' if output_redirected_to_file else colour

COLOUR_GREEN =  ColourCode("\x1b[0;32m")
COLOUR_ORANGE = ColourCode("\x1b[0;33m")
COLOUR_RED =    ColourCode("\x1b[0;31m")
NO_COLOUR =     ColourCode("\x1b[0m")

# Indicates the 'type' of the last printed line.
LINE_TYPE_NONE = 0
# Any type below this one is overwritable.
LINE_TYPE_OVERWRITABLE = 1
LINE_TYPE_PROGRESS = 2
LINE_TYPE_LINTER = 3

__print_lock__ = multiprocessing.Lock()
__last_overwritable_line_length__ = multiprocessing.Value('i', 0)
__last_line_type__ = multiprocessing.Value('i', LINE_TYPE_NONE)


def EnsureNewLine():
  if __last_line_type__.value >= LINE_TYPE_OVERWRITABLE:
    sys.stdout.write('\n')
    __last_line_type__.value = LINE_TYPE_NONE


def PrintInternal(string):
  sys.stdout.write(string)
  spaces = __last_overwritable_line_length__.value - len(string)
  if spaces > 0:
    sys.stdout.write(' ' * spaces)


def Print(string, has_lock = False):
  if not has_lock: __print_lock__.acquire()

  if __last_line_type__.value != LINE_TYPE_NONE:
    sys.stdout.write('\n')

  PrintInternal(string)
  sys.stdout.write('\n')
  __last_overwritable_line_length__.value = 0
  __last_line_type__.value = LINE_TYPE_NONE

  if not has_lock: __print_lock__.release()


# Lines of a specific type only overwrite and can only be overwritten by lines
# of the same type.
def PrintOverwritableLine(string, has_lock = False, type = LINE_TYPE_NONE):
  if not has_lock: __print_lock__.acquire()

  if (__last_line_type__.value != type) and \
      (__last_line_type__.value >= LINE_TYPE_OVERWRITABLE):
    sys.stdout.write('\n')

  PrintInternal(string)
  if not output_redirected_to_file:
    sys.stdout.write('\r')
  else:
    sys.stdout.write('\n')
  sys.stdout.flush()

  __last_overwritable_line_length__.value = len(string)
  __last_line_type__.value = type

  if not has_lock: __print_lock__.release()


# Display the run progress:
# prefix [time| progress|+ passed|- failed]  name
def UpdateProgress(start_time, passed, failed, count, name, prefix = '',
                   prevent_next_overwrite = False, has_lock = False):
  minutes, seconds = divmod(time.time() - start_time, 60)
  progress = float(passed + failed) / count * 100
  passed_colour = COLOUR_GREEN if passed != 0 else ''
  failed_colour = COLOUR_RED if failed != 0 else ''
  indicator = '[%02d:%02d| %3d%%|'
  indicator += passed_colour + '+ %d' + NO_COLOUR + '|'
  indicator += failed_colour + '- %d' + NO_COLOUR + ']'

  progress_string = prefix
  progress_string += indicator % (minutes, seconds, progress, passed, failed)
  progress_string += '  ' + name

  PrintOverwritableLine(progress_string, type = LINE_TYPE_PROGRESS,
                        has_lock = has_lock)
  if prevent_next_overwrite:
    sys.stdout.write('\n')
    __last_line_type__.value = LINE_TYPE_NONE
