/*
 *******************************************************************************
 * Copyright (C) 2012-2014, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.util;

import java.util.Date;

import com.ibm.icu.util.ULocale.Category;

/**
 * <code>DangiCalendar</code> is a concrete subclass of {@link Calendar}
 * that implements a traditional Korean calendar.
 * 
 * @internal
 * @deprecated This API is ICU internal only.
 */
@Deprecated
public class DangiCalendar extends ChineseCalendar {

    private static final long serialVersionUID = 8156297445349501985L;

    /**
     * The start year of the Korean traditional calendar (Dan-gi) is the inaugural
     * year of Dan-gun (BC 2333).
     */
    private static final int DANGI_EPOCH_YEAR = -2332;

    /**
     * The time zone used for performing astronomical computations for
     * Dangi calendar. In Korea various timezones have been used historically 
     * (cf. http://www.math.snu.ac.kr/~kye/others/lunar.html): 
     *  
     *            - 1908/04/01: GMT+8 
     * 1908/04/01 - 1911/12/31: GMT+8.5 
     * 1912/01/01 - 1954/03/20: GMT+9 
     * 1954/03/21 - 1961/08/09: GMT+8.5 
     * 1961/08/10 -           : GMT+9 
     *  
     * Note that, in 1908-1911, the government did not apply the timezone change 
     * but used GMT+8. In addition, 1954-1961's timezone change does not affect 
     * the lunar date calculation. Therefore, the following simpler rule works: 
     *   
     * -1911: GMT+8 
     * 1912-: GMT+9 
     *  
     * Unfortunately, our astronomer's approximation doesn't agree with the 
     * references (http://www.math.snu.ac.kr/~kye/others/lunar.html and 
     * http://astro.kasi.re.kr/Life/ConvertSolarLunarForm.aspx?MenuID=115) 
     * in 1897/7/30. So the following ad hoc fix is used here: 
     *  
     *     -1896: GMT+8 
     *      1897: GMT+7 
     * 1898-1911: GMT+8 
     * 1912-    : GMT+9 
     */
    private static final TimeZone KOREA_ZONE;

    static {
        InitialTimeZoneRule initialTimeZone = new InitialTimeZoneRule("GMT+8", 8 * ONE_HOUR, 0);
        long[] millis1897 = { (1897 - 1970) * 365L * ONE_DAY }; // some days of error is not a problem here
        long[] millis1898 = { (1898 - 1970) * 365L * ONE_DAY }; // some days of error is not a problem here
        long[] millis1912 = { (1912 - 1970) * 365L * ONE_DAY }; // this doesn't create an issue for 1911/12/20
        TimeZoneRule rule1897 = new TimeArrayTimeZoneRule("Korean 1897", 7 * ONE_HOUR, 0, millis1897,
                DateTimeRule.STANDARD_TIME);
        TimeZoneRule rule1898to1911 = new TimeArrayTimeZoneRule("Korean 1898-1911", 8 * ONE_HOUR, 0, millis1898,
                DateTimeRule.STANDARD_TIME);
        TimeZoneRule ruleFrom1912 = new TimeArrayTimeZoneRule("Korean 1912-", 9 * ONE_HOUR, 0, millis1912,
                DateTimeRule.STANDARD_TIME);

        RuleBasedTimeZone tz = new RuleBasedTimeZone("KOREA_ZONE", initialTimeZone);
        tz.addTransitionRule(rule1897);
        tz.addTransitionRule(rule1898to1911);
        tz.addTransitionRule(ruleFrom1912);
        tz.freeze();
        KOREA_ZONE = tz;
    };

    /**
     * Construct a <code>DangiCalendar</code> with the default time zone and locale.
     * 
     * @internal
     * @deprecated This API is ICU internal only.
     */
    @Deprecated
    public DangiCalendar() {
        this(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
    }

    /**
     * Construct a <code>DangiCalendar</code> with the give date set in the default time zone
     * with the default locale.
     * @param date The date to which the new calendar is set.
     * 
     * @internal
     * @deprecated This API is ICU internal only.
     */
    @Deprecated
    public DangiCalendar(Date date) {
        this(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
        setTime(date);
    }

    /**
     * Construct a <code>DangiCalendar</code>  based on the current time
     * with the given time zone with the given locale.
     * @param zone the given time zone
     * @param locale the given locale
     * 
     * @internal
     * @deprecated This API is ICU internal only.
     */
    @Deprecated
    public DangiCalendar(TimeZone zone, ULocale locale) {
        super(zone, locale, DANGI_EPOCH_YEAR, KOREA_ZONE);
    }

    /**
     * {@inheritDoc}
     * 
     * @internal
     * @deprecated This API is ICU internal only.
     */
    @Deprecated
    public String getType() {
        return "dangi";
    }
}
