/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.
 */

package com.facebook.buck.util;

import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;

import java.io.PrintStream;

public class Console {

  private final Verbosity verbosity;
  private final DirtyPrintStreamDecorator stdOut;
  private final DirtyPrintStreamDecorator stdErr;
  private final Ansi ansi;

  public Console(Verbosity verbosity,
      PrintStream stdOut,
      PrintStream stdErr,
      Ansi ansi) {
    this.verbosity = verbosity;
    this.stdOut = new DirtyPrintStreamDecorator(stdOut);
    this.stdErr = new DirtyPrintStreamDecorator(stdErr);
    this.ansi = ansi;
  }

  public Verbosity getVerbosity() {
    return verbosity;
  }

  public Ansi getAnsi() {
    return ansi;
  }

  public DirtyPrintStreamDecorator getStdOut() {
    return stdOut;
  }

  public DirtyPrintStreamDecorator getStdErr() {
    return stdErr;
  }

  /**
   * @param successMessage single line of text without a trailing newline. If stdErr is attached to
   *     a terminal, then this will append an ANSI reset escape sequence followed by a newline.
   */
  public void printSuccess(String successMessage) {
    Preconditions.checkArgument(!successMessage.endsWith("\n"),
        "Trailing newline will be added by this method");
    ansi.printHighlightedSuccessText(stdErr, successMessage);
    stdErr.print('\n');
  }

  /**
   * Prints an error message to stderr that will be highlighted in red if stderr is a tty.
   */
  public void printErrorText(String message) {
    stdErr.println(ansi.asErrorText(message));
  }

  /**
   * Prints the root cause of the {@link Throwable} with its stacktrace as a build failure.
   * @see #printBuildFailure(String)
   */
  public void printBuildFailureWithStacktrace(Throwable t) {
    t.printStackTrace(stdErr);
    printBuildFailure("Unexpected internal error (if you are using buckd, you should restart it).");
  }

  /**
   * Prints the message of the root cause of the {@link Throwable} as a build failure.
   * @see #printBuildFailure(String)
   */
  public void printBuildFailureWithoutStacktrace(Throwable t) {
    printBuildFailure(Throwables.getRootCause(t).getMessage());
  }

  /**
   * Prints an error message prefixed with {@code BUILD FAILED} to stderr that will be highlighted
   * in red if stderr is a tty.
   */
  public void printBuildFailure(String failureMessage) {
    ansi.printlnHighlightedFailureText(stdErr, String.format("BUILD FAILED: %s", failureMessage));
  }
}

@@ -633,16 +633,54 @@
 .util;%0A%0A
+import com.facebook.buck.log.Logger;%0A%0A
 import c
@@ -812,16 +812,80 @@
 sole %7B%0A%0A
+  private static final Logger LOG = Logger.get(Console.class);%0A%0A
   privat
@@ -1962,16 +1962,68 @@
 thod%22);%0A
+    LOG.debug(%22Build success: %25s%22, successMessage);%0A
     ansi
@@ -2251,24 +2251,66 @@
  message) %7B%0A
+    LOG.warn(%22Build error: %25s%22, message);%0A
     stdErr.p
@@ -2547,24 +2547,76 @@
 owable t) %7B%0A
+    LOG.warn(t, %22Build error caused by exception%22);%0A
     t.printS
@@ -2655,17 +2655,34 @@
 dFailure
-(
+Internal(%0A        
 %22Unexpec
@@ -2953,24 +2953,76 @@
 owable t) %7B%0A
+    LOG.warn(t, %22Build error caused by exception%22);%0A
     printBui
@@ -3030,16 +3030,24 @@
 dFailure
+Internal
 (Throwab
@@ -3282,24 +3282,193 @@
 eMessage) %7B%0A
+    LOG.warn(%22Build failure: %25s%22, failureMessage);%0A    printBuildFailureInternal(failureMessage);%0A  %7D%0A%0A  private void printBuildFailureInternal(String failureMessage) %7B%0A
     ansi.pri

Report swallowed exceptions sent to Console to debug log