/*
 * Copyright 2010 Google 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 java.util.logging;

import java.util.ArrayList;
import java.util.List;

/**
 *  An emulation of the java.util.logging.Logger class. See
 *  <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/Logger.html">
 *  The Java API doc for details</a>
 */
public class Logger {

public static final String GLOBAL_LOGGER_NAME = "global";

  private static final boolean SUPER_DEV_MODE =
      System.getProperty("superdevmode", "off").equals("on");

  private static final String LOGGING_ENABLED =
      System.getProperty("gwt.logging.enabled", SUPER_DEV_MODE ? "TRUE" : "FALSE");

  private static final boolean LOGGING_WARNING = LOGGING_ENABLED.equals("WARNING");
  private static final boolean LOGGING_SEVERE = LOGGING_ENABLED.equals("SEVERE");
  private static final boolean LOGGING_FALSE = LOGGING_ENABLED.equals("FALSE");

  static {
    assertLoggingValues();
  }

  public static Logger getGlobal() {
    return getLogger(GLOBAL_LOGGER_NAME);
  }

  public static Logger getLogger(String name) {
    return getLogger(name, null);
  }

  public static Logger getLogger(String name, String resourceName) {
    // Use shortcut if logging is disabled to avoid parent logger creations in LogManager
    if (LOGGING_FALSE) {
      return new Logger(name, resourceName);
    }
    return LogManager.getLogManager().ensureLogger(name, resourceName);
  }

  static void assertLoggingValues() {
    if (LOGGING_ENABLED.equals("FALSE") || LOGGING_ENABLED.equals("TRUE")
        || LOGGING_ENABLED.equals("SEVERE") || LOGGING_ENABLED.equals("WARNING")) {
      return;
    }

    throw new RuntimeException("Undefined value for gwt.logging.enabled: '" + LOGGING_ENABLED
        + "'. Allowed values are TRUE, FALSE, SEVERE, WARNING");
  }

  private List<Handler> handlers;
  private Level level = null;
  private String name;
  private Logger parent;  // Should never be null except in the RootLogger
  private boolean useParentHandlers;

  protected Logger(String name, @SuppressWarnings("unused") String resourceName) {
    if (LOGGING_FALSE) {
      return;
    }

    this.name = name;
    this.useParentHandlers = true;
    handlers = new ArrayList<Handler>();
  }

  public void addHandler(Handler handler) {
    if (LOGGING_FALSE) {
      return;
    }
    handlers.add(handler);
  }

  public void config(String msg) {
    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
      return;
    }
    log(Level.CONFIG, msg);
  }

  public void fine(String msg) {
    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
      return;
    }
    log(Level.FINE, msg);
  }

  public void finer(String msg) {
    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
      return;
    }
    log(Level.FINER, msg);
  }

  public void finest(String msg) {
    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
      return;
    }
    log(Level.FINEST, msg);
  }

  public void info(String msg) {
    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
      return;
    }
    log(Level.INFO, msg);
  }

  public void warning(String msg) {
    if (LOGGING_FALSE || LOGGING_SEVERE) {
      return;
    }
    log(Level.WARNING, msg);
  }

  public void severe(String msg) {
    if (LOGGING_FALSE) {
      return;
    }
    log(Level.SEVERE, msg);
  }

  public Handler[] getHandlers() {
    if (LOGGING_FALSE) {
      return new Handler[0];
    }

    return handlers.toArray(new Handler[handlers.size()]);
  }

  public Level getLevel() {
    return LOGGING_FALSE ? null : level;
  }

  public String getName() {
    return LOGGING_FALSE ? null : name;
  }

  public Logger getParent() {
    return LOGGING_FALSE ? null : parent;
  }

  public String getResourceBundleName() {
    return null;
  }

  public boolean getUseParentHandlers() {
    return LOGGING_FALSE ? false : useParentHandlers;
  }

  public boolean isLoggable(Level messageLevel) {
    return LOGGING_FALSE
        ? false : getEffectiveLevel().intValue() <= messageLevel.intValue();
  }

  public void log(Level level, String msg) {
    log(level, msg, null);
  }

  public void log(Level level, String msg, Throwable thrown) {
    if (LOGGING_FALSE) {
      return;
    }
    if (LOGGING_SEVERE) {
      if (level.intValue() >= 1000) {
        actuallyLog(level, msg, thrown);
      }
    } else if (LOGGING_WARNING) {
      if (level.intValue() >= Level.WARNING.intValue()) {
        actuallyLog(level, msg, thrown);
      }
    } else {
      actuallyLog(level, msg, thrown);
    }
  }

  public void log(LogRecord record) {
    if (LOGGING_FALSE) {
      return;
    }
    if (LOGGING_SEVERE) {
      if (record.getLevel().intValue() >= 1000) {
        actuallyLog(record);
      }
    } else if (LOGGING_WARNING) {
      if (record.getLevel().intValue() >= Level.WARNING.intValue()) {
        actuallyLog(record);
      }
    } else {
      actuallyLog(record);
    }
  }

  public void removeHandler(Handler handler) {
    if (LOGGING_FALSE) {
      return;
    }
    handlers.remove(handler);
  }

  public void setLevel(Level newLevel) {
    if (LOGGING_FALSE) {
      return;
    }
    this.level = newLevel;
  }

  public void setParent(Logger newParent) {
    if (LOGGING_FALSE) {
      return;
    }
    if (newParent != null) {
      parent = newParent;
    }
  }

  public void setUseParentHandlers(boolean newUseParentHandlers) {
    if (LOGGING_FALSE) {
      return;
    }
    this.useParentHandlers = newUseParentHandlers;
  }

  private Level getEffectiveLevel() {
    if (level != null) {
      return level;
    }

    Logger logger = getParent();
    while (logger != null) {
      Level effectiveLevel = logger.getLevel();
      if (effectiveLevel != null) {
        return effectiveLevel;
      }
      logger = logger.getParent();
    }
    return Level.INFO;
  }

  private void actuallyLog(Level level, String msg, Throwable thrown) {
    if (isLoggable(level)) {
      LogRecord record = new LogRecord(level, msg);
      record.setThrown(thrown);
      record.setLoggerName(getName());
      actuallyLog(record);
    }
  }

  private void actuallyLog(LogRecord record) {
    if (isLoggable(record.getLevel())) {
      for (Handler handler : getHandlers()) {
        handler.publish(record);
      }
      Logger logger = getUseParentHandlers() ? getParent() : null;
      while (logger != null) {
        for (Handler handler : logger.getHandlers()) {
          handler.publish(record);
        }
        logger = logger.getUseParentHandlers() ? logger.getParent() : null;
      }
    }
  }

  /* Not Implemented */
  // public static Logger getAnonymousLogger() {
  // public static Logger getAnonymousLogger(String resourceBundleName) {}
  // public Filter getFilter() {}
  // public ResourceBundle getResourceBundle() {}
  // public void setFilter(Filter newFilter) {}
  // public void entering(String sourceClass, String sourceMethod) {}
  // public void entering(String sourceClass, String sourceMethod, Object param1) {}
  // public void entering(String sourceClass, String sourceMethod, Object[] params) {}
  // public void exiting(String sourceClass, String sourceMethod, Object result) {}
  // public void exiting(String sourceClass, String sourceMethod) {}
  // public void log(Level level, String msg, Object param1) {}
  // public void log(Level level, String msg, Object[] params) {}
  // public void logp(Level level, String sourceClass, String sourceMethod, String msg) {}
  // public void logp(Level level, String sourceClass, String sourceMethod, String msg, Object param1) {}
  // public void logp(Level level, String sourceClass, String sourceMethod, String msg, Object[] params) {}
  // public void logp(Level level, String sourceClass, String sourceMethod, String msg, Throwable thrown) {}
  // public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg) {}
  // public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object param1) {}
  // public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object[] params) {}
  // public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Throwable thrown) {}
  // public void throwing(String sourceClass, String sourceMethod, Throwable thrown) {}
}