/*
 * 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.io.Serializable;
import java.util.Locale;

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

  public static Level ALL = new LevelAll();
  public static Level CONFIG = new LevelConfig();
  public static Level FINE = new LevelFine();
  public static Level FINER = new LevelFiner();
  public static Level FINEST = new LevelFinest();
  public static Level INFO = new LevelInfo();
  public static Level OFF = new LevelOff();
  public static Level SEVERE = new LevelSevere();
  public static Level WARNING = new LevelWarning();

  private static class LevelAll extends Level {
    @Override public String getName() { return "ALL"; }
    @Override public int intValue() { return Integer.MIN_VALUE; }
  }

  private static class LevelConfig extends Level {
    @Override public String getName() { return "CONFIG"; }
    @Override public int intValue() { return 700; }
  }

  private static class LevelFine extends Level {
    @Override public String getName() { return "FINE"; }
    @Override public int intValue() { return 500; }
  }

  private static class LevelFiner extends Level {
    @Override public String getName() { return "FINER"; }
    @Override public int intValue() { return 400; }
  }

  private static class LevelFinest extends Level {
    @Override public String getName() { return "FINEST"; }
    @Override public int intValue() { return 300; }
  }

  private static class LevelInfo extends Level {
    @Override public String getName() { return "INFO"; }
    @Override public int intValue() { return 800; }
  }

  private static class LevelOff extends Level {
    @Override public String getName() { return "OFF"; }
    @Override public int intValue() { return Integer.MAX_VALUE; }
  }

  private static class LevelSevere extends Level {
    @Override public String getName() { return "SEVERE"; }
    @Override public int intValue() { return 1000; }
  }

  private static class LevelWarning extends Level {
    @Override public String getName() { return "WARNING"; }
    @Override public int intValue() { return 900; }
  }

  public static Level parse(String name) {
    // '==' instead of equals makes it compile out faster.
    if (System.getProperty("jre.logging.logLevel") == "OFF") {
      return null;
    }

    String value = name.toUpperCase(Locale.ROOT);
    switch (value) {
      case "ALL":
        return Level.ALL;

      case "CONFIG":
        return Level.CONFIG;

      case "FINE":
        return Level.FINE;

      case "FINER":
        return Level.FINER;

      case "FINEST":
        return Level.FINEST;

      case "INFO":
        return Level.INFO;

      case "OFF":
        return Level.OFF;

      case "SEVERE":
        return Level.SEVERE;

      case "WARNING":
        return Level.WARNING;

      default:
        throw new IllegalArgumentException("Invalid level \"" + name + "\"");
    }
  }

  protected Level() { }

  public String getName() {
    return "DUMMY";
  }

  public int intValue() {
    return -1;
  }

  @Override
  public String toString() {
    return getName();
  }

  /* Not Implemented */
  // public boolean equals(Object ox) {}
  // protected Level(String name, int value, String resourceBundleName) {}
  // public String getLocalizedName() {}
  // public String getResourceBundleName() {}
  // public int  hashCode() {}
}
