/****************************************************************************
 * Copyright (C) 2000-2013, International Business Machines Corporation and
 * others. All Rights Reserved.
 ****************************************************************************
 */

package com.ibm.icu.text;

import java.util.Locale;

import com.ibm.icu.impl.CalendarData;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.ChineseCalendar;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.ULocale.Category;

/**
 * A subclass of {@link DateFormatSymbols} for {@link ChineseDateFormat}.
 * This class contains additional symbols corresponding to the
 * <code>ChineseCalendar.IS_LEAP_MONTH</code> field.
 *
 * @see ChineseDateFormat
 * @see com.ibm.icu.util.ChineseCalendar
 * @author Alan Liu
 * @deprecated ICU 50 
 */
public class ChineseDateFormatSymbols extends DateFormatSymbols {
    // Generated by serialver from JDK 1.4.1_01
    static final long serialVersionUID = 6827816119783952890L;
    
    /*
     * Package-private array that ChineseDateFormat needs to be able to
     * read.
     */
    String[] isLeapMonth;

    /**
     * Construct a ChineseDateFormatSymbols for the default <code>FORMAT</code> locale.
     * @see Category#FORMAT
     * @deprecated ICU 50
     */
    public ChineseDateFormatSymbols() {
        this(ULocale.getDefault(Category.FORMAT));
    }

    /**
     * Construct a ChineseDateFormatSymbols for the provided locale.
     * @param locale the locale
     * @deprecated ICU 50
     */
    public ChineseDateFormatSymbols(Locale locale) {
        super(ChineseCalendar.class, ULocale.forLocale(locale));
    }

    /**
     * Construct a ChineseDateFormatSymbols for the provided locale.
     * @param locale the locale
     * @deprecated ICU 50
     */
    public ChineseDateFormatSymbols(ULocale locale) {
        super(ChineseCalendar.class, locale);
    }

    /**
     * Construct a ChineseDateFormatSymbols for the provided calendar and locale.
     * @param cal the Calendar
     * @param locale the locale
     * @deprecated ICU 50
     */
    public ChineseDateFormatSymbols(Calendar cal, Locale locale) {
        // NPE is thrown here when cal is null, like the super class does
        super(cal.getClass(), locale);
    }

    /**
     * Construct a ChineseDateFormatSymbols for the provided calendar and locale.
     * @param cal the Calendar
     * @param locale the locale
     * @deprecated ICU 50
     */
    public ChineseDateFormatSymbols(Calendar cal, ULocale locale) {
        // NPE is thrown here when cal is null, like the super class does
        super(cal.getClass(), locale);
    }

    // New API
    /**
     * @deprecated ICU 50
     */
    public String getLeapMonth(int leap) {
        return isLeapMonth[leap];
    }

    /**
     * {@inheritDoc}
     * @deprecated ICU 50
     */
    protected void initializeData(ULocale loc, CalendarData calData) {
        super.initializeData(loc, calData);
        initializeIsLeapMonth();
    }

    void initializeData(DateFormatSymbols dfs) {
        super.initializeData(dfs);
        if (dfs instanceof ChineseDateFormatSymbols) {
            // read-only array, no need to clone
            this.isLeapMonth = ((ChineseDateFormatSymbols)dfs).isLeapMonth;
        } else {
            initializeIsLeapMonth();
        }
    }

    private void initializeIsLeapMonth() {
        // The old way, obsolete:
        //isLeapMonth = calData.getStringArray("isLeapMonth");
        // The new way to fake this for backward compatibility (no longer used to format/parse):

        isLeapMonth = new String[2];
        isLeapMonth[0] = "";
        isLeapMonth[1] = (leapMonthPatterns != null)? leapMonthPatterns[DT_LEAP_MONTH_PATTERN_FORMAT_WIDE].replace("{0}", ""): "";
    }
}
