// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
******************************************************************************
* Copyright (C) 2007, International Business Machines Corporation and   *
* others. All Rights Reserved.                                               *
******************************************************************************
*/

package com.ibm.icu.impl.duration;

/**
 * 'Enum' for individual time units.  Not an actual enum so that it can be 
 * used by Java 1.4.
 */
public final class TimeUnit {
  /** The name of this unit, a key, not for localization. */
  final String name;

  /** The ordinal of the unit, in order from largest to smallest. */
  final byte ordinal;

  /** Private constructor */
  private TimeUnit(String name, int ordinal) {
    this.name = name;
    this.ordinal = (byte) ordinal;
  }

  public String toString() {
    return name;
  }
  
  /** Represents a year. */ 
  public static final TimeUnit YEAR = new TimeUnit("year", 0);

  /** Represents a month. */  
  public static final TimeUnit MONTH = new TimeUnit("month", 1);

  /** Represents a week. */ 
  public static final TimeUnit WEEK = new TimeUnit("week", 2);

  /** Represents a day. */ 
  public static final TimeUnit DAY = new TimeUnit("day", 3);

  /** Represents an hour. */ 
  public static final TimeUnit HOUR = new TimeUnit("hour", 4);

  /** Represents a minute. */ 
  public static final TimeUnit MINUTE = new TimeUnit("minute", 5);

  /** Represents a second. */ 
  public static final TimeUnit SECOND = new TimeUnit("second", 6);

  /** Represents a millisecond. */ 
  public static final TimeUnit MILLISECOND = new TimeUnit("millisecond", 7);

  /** Returns the next larger time unit, or null if this is the largest. */
  public TimeUnit larger() {
    return ordinal == 0 ? null : units[ordinal - 1];
  }

  /** Returns the next smaller time unit, or null if this is the smallest. */
  public TimeUnit smaller() {
    return ordinal == units.length - 1 ? null : units[ordinal + 1];
  }

  /** The list of units, in order from largest to smallest. */
  static final TimeUnit[] units = {
    YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND, MILLISECOND
  };

    /** Returns the ordinal value of this time unit, largest is 0. **/
  public int ordinal() {
    return ordinal;
  }

  /** Approximate, durations for the units independent of the time at which
      they are measured */

  // hack, initialization long array using expressions with 'L' at end doesn't
  // compute entire expression using 'long'.  differs from initializtion of
  // a single constant
  static final long[] approxDurations = {
    36525L*24*60*60*10, 3045*24*60*60*10L, 7*24*60*60*1000L, 24*60*60*1000L, 
    60*60*1000L, 60*1000L, 1000L, 1L
  };
}
