/*
 * 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) {
    Logger.assertLoggingValues();
    boolean loggingDisabled = System.getProperty("gwt.logging.enabled", "FALSE").equals("FALSE");
    if (loggingDisabled) {
      return null;
    }

    name = name.toUpperCase(Locale.ROOT);
    if (name.equals("ALL")) {
      return ALL;
    } else if (name.equals("CONFIG")) {
      return CONFIG;
    } else if (name.equals("FINE")) {
      return FINE;
    } else if (name.equals("FINER")) {
      return FINER;
    } else if (name.equals("FINEST")) {
      return FINEST;
    } else if (name.equals("INFO")) {
      return INFO;
    } else if (name.equals("OFF")) {
      return OFF;
    } else if (name.equals("SEVERE")) {
      return SEVERE;
    } else if (name.equals("WARNING")) {
      return WARNING;
    }
    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() {}
}
