# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import sys

import cros_build_lib

# Output verbosity levels that we support
ERROR = 0
WARNING = 1
NOTICE = 2
INFO = 3
DEBUG = 4

class Output:
  """Output class for Chrome OS.

  This class handles output of progress and other useful information
  to the user. It provides for simple verbosity level control and can
  output nothing but errors at verbosity zero.

  The idea is that modules set up an Output object early in their years and pass
  it around to other modules that need it. This keeps the output under control
  of a single class.

  TODO(sjg): Merge / join with Chromite libraries

  Public properties:
    verbose: Verbosity level: 0=silent, 1=progress, 3=full, 4=debug
  """
  def __init__(self, verbose=WARNING, stdout=sys.stdout):
    """Initialize a new output object.

    Args:
      verbose: Verbosity level (0-4).
      stdout: File to use for stdout.
    """
    self.verbose = verbose
    self._progress = ''          # Our last progress message
    self._color = cros_build_lib.Color()
    self._stdout = stdout

    # TODO(sjg): Move this into Chromite libraries when we have them
    self.stdout_is_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()

  def __enter__(self):
    return self

  def __exit__(self, type, value, traceback):
    """Clean up and remove any progress message."""
    self.ClearProgress()
    return False

  def UserIsPresent(self):
    """This returns True if it is likely that a user is present.

    Sometimes we want to prompt the user, but if no one is there then this
    is a waste of time, and may lock a script which should otherwise fail.

    Returns:
      True if it thinks the user is there, and False otherwise
    """
    return self.stdout_is_tty and self.verbose > 0

  def ClearProgress(self):
    """Clear any active progress message on the terminal."""
    if self.verbose > 0 and self.stdout_is_tty:
      self._stdout.write('\r%s\r' % (" " * len (self._progress)))
      self._stdout.flush()

  def Progress(self, msg, warning=False):
    """Display progress information.

    Args:
      msg: Message to display.
      warning: True if this is a warning."""
    self.ClearProgress()
    if self.verbose > 0:
      self._progress = msg + '...'
      if self.stdout_is_tty:
        col = self._color.YELLOW if warning else self._color.GREEN
        self._stdout.write('\r' + self._color.Color(col, self._progress))
        self._stdout.flush()
      else:
        self._stdout.write(self._progress + '\n')

  def _Output(self, level, msg, color=None):
    """Output a message to the terminal.

    Args:
      level: Verbosity level for this message. It will only be displayed if
          this as high as the currently selected level.
      msg; Message to display.
      error: True if this is an error message, else False.
    """
    self.ClearProgress()
    if self.verbose >= level:
      if color:
        msg = self._color.Color(color, msg)
      self._stdout.write(msg + '\n')

  def DoOutput(self, level, msg):
    """Output a message to the terminal.

    Args:
      level: Verbosity level for this message. It will only be displayed if
          this as high as the currently selected level.
      msg; Message to display.
    """
    self._Output(level, msg)

  def Error(self, msg):
    """Display an error message

    Args:
      msg; Message to display.
    """
    self._Output(0, msg, self._color.RED)

  def Warning(self, msg):
    """Display a warning message

    Args:
      msg; Message to display.
    """
    self._Output(1, msg, self._color.YELLOW)

  def Notice(self, msg):
    """Display an important infomation message

    Args:
      msg; Message to display.
    """
    self._Output(2, msg)

  def Info(self, msg):
    """Display an infomation message

    Args:
      msg; Message to display.
    """
    self._Output(3, msg)

  def Debug(self, msg):
    """Display a debug message

    Args:
      msg; Message to display.
    """
    self._Output(4, msg)
