package util;

/**
  * Debug management class.
  *
  * <p>You can use calls to {@link #print Debug.print} for any debug message you want to print
  * in your program.</p>
  *
  * @author Steffen Zschaler
  * @version 1.0
  * @since v1.0
  */
public class Debug extends Object {

  /**
    * The current debug level.
    */
  private static int s_nDebugLevel = 10;
  /**
    * Show system messages (level == -1)?
    */
  private static boolean s_fSysMsg = false;

  /**
    * Set the maximum debug level.
    *
    * <p>When printing messages with {@link #print}, only messages with a debug level less or
    * equal the maximum debug level will be printed.</p>
    *
    * @param nLevel the maximum debug level. Defaults to 10.
    *
    * @return the former maximum debug level.
    */
  public static synchronized int setMaxDebugLevel (int nLevel) {
    int nOld = s_nDebugLevel;

    s_nDebugLevel = nLevel;

    return nOld;
  }

  /**
    * Switch on printing of framework internal debug messages.
    */
  public static void traceSystemMessages() {
    traceSystemMessages (true);
  }

  /**
    * Switch off printing of framework internal debug messages.
    */
  public static void untraceSystemMessages() {
    traceSystemMessages (false);
  }

  /**
    * Switch printing of framework internal debug messages.
    *
    * @param fSwitch if true, framework internal debug messages will henceforward be printed.
    */
  public static synchronized void traceSystemMessages (boolean fSwitch) {
    s_fSysMsg = fSwitch;
  }

  /**
    * Print a message to STDERR.
    *
    * <p>Prints <code>s</code> to {@link java.lang.System#err}, if <code>nLevel</code> is less
    * or equal the maximum debug level.</p>
    *
    * @param s the debug message.
    * @param nLevel the message's debug level. Must be greater or equal zero.
    */
  public static synchronized void print (String s,
                                         int nLevel) {
    if (((nLevel == -1) &&
         (s_fSysMsg)) ||
        ((nLevel >=0) &&
         (nLevel <= s_nDebugLevel)))
      System.err.println (s);
  }
}