/*
********************************************************************************
*   Copyright (C) 1997-1999, International Business Machines
*   Corporation and others.  All Rights Reserved.
********************************************************************************
*
* File DATEFMT.H
*
* Modification History:
*
*   Date        Name        Description
*   02/19/97    aliu        Converted from java.
*   04/01/97    aliu        Added support for centuries.
*    07/23/98    stephen        JDK 1.2 sync
*   11/15/99    weiv        Added support for week of year/day of week formatting
********************************************************************************
*/

#ifndef DATEFMT_H
#define DATEFMT_H
 
#include "unicode/utypes.h"
#include "unicode/calendar.h"
#include "unicode/numfmt.h"
#include "unicode/format.h"
#include "unicode/locid.h"
class TimeZone;

/**
 * DateFormat is an abstract class for a family of classes that convert dates and
 * times from their internal representations to textual form and back again in a
 * language-independent manner. Converting from the internal representation (milliseconds
 * since midnight, January 1, 1970) to text is known as "formatting," and converting
 * from text to millis is known as "parsing."  We currently define only one concrete
 * subclass of DateFormat: SimpleDateFormat, which can handle pretty much all normal
 * date formatting and parsing actions.
 * <P>
 * DateFormat helps you to format and parse dates for any locale. Your code can
 * be completely independent of the locale conventions for months, days of the
 * week, or even the calendar format: lunar vs. solar.
 * <P>
 * To format a date for the current Locale, use one of the static factory
 * methods:
 * <pre>
 * .    DateFormat* dfmt = DateFormat::createDateInstance();
 * .    UnicodeString myString;
 * .    myString = dfmt->format( myDate, myString );
 * </pre>
 * If you are formatting multiple numbers, it is more efficient to get the
 * format and use it multiple times so that the system doesn't have to fetch the
 * information about the local language and country conventions multiple times.
 * <pre>
 * .    DateFormat* df = DateFormat::createDateInstance();
 * .    UnicodeString myString;
 * .    UDate myDateArr[] = { 0.0, 100000000.0, 2000000000.0 }; // test values
 * .    for (int32_t i = 0; i < 3; ++i) {
 * .        myString.remove();
 * .        cout &lt;&lt; df->format( myDateArr[i], myString ) &lt;&lt; endl;
 * .    }
 * </pre>
 * To format a date for a different Locale, specify it in the call to
 * getDateInstance().
 * <pre>
 * .       DateFormat* df =
 * .          DateFormat::createDateInstance( DateFormat::SHORT, Locale::FRANCE);
 * </pre>
 * You can use a DateFormat to parse also.
 * <pre>
 * .       UErrorCode status = U_ZERO_ERROR;
 * .       UDate myDate = df->parse(myString, status);
 * </pre>
 * Use createDateInstance() to produce the normal date format for that country.
 * There are other static factory methods available. Use createTimeInstance()
 * to produce the normal time format for that country. Use createDateTimeInstance()
 * to produce a DateFormat that formats both date and time. You can pass in
 * different options to these factory methods to control the length of the
 * result; from SHORT to MEDIUM to LONG to FULL. The exact result depends on the
 * locale, but generally:
 * <ul type=round>
 *   <li>   SHORT is completely numeric, such as 12/13/52 or 3:30pm
 *   <li>   MEDIUM is longer, such as Jan 12, 1952
 *   <li>   LONG is longer, such as January 12, 1952 or 3:30:32pm
 *   <li>   FULL is pretty completely specified, such as
 *          Tuesday, April 12, 1952 AD or 3:30:42pm PST.
 * </ul>
 * You can also set the time zone on the format if you wish. If you want even
 * more control over the format or parsing, (or want to give your users more
 * control), you can try casting the DateFormat you get from the factory methods
 * to a SimpleDateFormat. This will work for the majority of countries; just
 * remember to chck getDynamicClassID() before carrying out the cast.
 * <P>
 * You can also use forms of the parse and format methods with ParsePosition and
 * FieldPosition to allow you to
 * <ul type=round>
 *   <li>   Progressively parse through pieces of a string.
 *   <li>   Align any particular field, or find out where it is for selection
 *          on the screen.
 * </ul>
 */
class U_I18N_API DateFormat : public Format {
public:
    /**
     * The following enum values are used in FieldPosition with date/time formatting.
     * They are also used to index into DateFormatSymbols::fgPatternChars, which
     * is the list of standard internal-representation pattern characters, and
     * the resource bundle localPatternChars data. For this reason, this enum
     * should be treated with care; don't change the order or contents of it
     * unless you really know what you are doing. You'll probably have to change
     * the code in DateFormatSymbols, SimpleDateFormat, and all the locale
     * resource bundle data files.
     */
    enum EField
    {
        kEraField = 0,      // ERA field alignment.
        kYearField,         // YEAR field alignment.
        kMonthField,        // MONTH field alignment.
        kDateField,         // DATE field alignment.
        kHourOfDay1Field,     // One-based HOUR_OF_DAY field alignment.
                            // kHourOfDay1Field is used for the one-based 24-hour clock.
                            // For example, 23:59 + 01:00 results in 24:59.
        kHourOfDay0Field,     // Zero-based HOUR_OF_DAY field alignment.
                            // HOUR_OF_DAY0_FIELD is used for the zero-based 24-hour clock.
                            // For example, 23:59 + 01:00 results in 00:59.
        kMinuteField,       // MINUTE field alignment.
        kSecondField,       // SECOND field alignment.
        kMillisecondField,  // MILLISECOND field alignment.
        kDayOfWeekField,      // DAY_OF_WEEK field alignment.
        kDayOfYearField,      // DAY_OF_YEAR field alignment.
        kDayOfWeekInMonthField,// DAY_OF_WEEK_IN_MONTH field alignment.
        kWeekOfYearField,     // WEEK_OF_YEAR field alignment.
        kWeekOfMonthField,    // WEEK_OF_MONTH field alignment.
        kAmPmField,            // AM_PM field alignment.
        kHour1Field,        // One-based HOUR field alignment.
                            // HOUR1_FIELD is used for the one-based 12-hour clock.
                            // For example, 11:30 PM + 1 hour results in 12:30 AM.
        kHour0Field,        // Zero-based HOUR field alignment.
                            // HOUR0_FIELD is used for the zero-based 12-hour clock.
                            // For example, 11:30 PM + 1 hour results in 00:30 AM.
        kTimezoneField,      // TIMEZONE field alignment.
        kYearWOYField,   // Corrected year for week representation
        kDOWLocalField, // localized day of week

        
        
    /**
     * These constants are provided for backwards compatibility only,
     * and are deprecated.  Please use the C++ style constants defined above.
     */
        ERA_FIELD                     = kEraField,
        YEAR_FIELD                     = kYearField,
        MONTH_FIELD                 = kMonthField,
        DATE_FIELD                     = kDateField,
        HOUR_OF_DAY1_FIELD             = kHourOfDay1Field,
        HOUR_OF_DAY0_FIELD             = kHourOfDay0Field,
        MINUTE_FIELD                 = kMinuteField,
        SECOND_FIELD                 = kSecondField,
        MILLISECOND_FIELD             = kMillisecondField,
        DAY_OF_WEEK_FIELD             = kDayOfWeekField,
        DAY_OF_YEAR_FIELD             = kDayOfYearField,
        DAY_OF_WEEK_IN_MONTH_FIELD     = kDayOfWeekInMonthField,
        WEEK_OF_YEAR_FIELD             = kWeekOfYearField,
        WEEK_OF_MONTH_FIELD         = kWeekOfMonthField,
        AM_PM_FIELD                 = kAmPmField,
        HOUR1_FIELD                 = kHour1Field,
        HOUR0_FIELD                 = kHour0Field,
        TIMEZONE_FIELD                 = kTimezoneField

    };

    /**
     * Constants for various style patterns. These reflect the order of items in
     * the DateTimePatterns resource. There are 4 time patterns, 4 date patterns,
     * and then the date-time pattern. Each block of 4 values in the resource occurs
     * in the order full, long, medium, short.
     */
    enum EStyle
    {
        kNone   = -1,

        kFull   = 0,
        kLong   = 1,
        kMedium = 2,
        kShort  = 3,

        kDateOffset   = kShort + 1,
     // kFull   + kDateOffset = 4
     // kLong   + kDateOffset = 5
     // kMedium + kDateOffset = 6
     // kShort  + kDateOffset = 7

        kDateTime             = 8,

        kDefault      = kMedium,

        
        
    /**
     * These constants are provided for backwards compatibility only,
     * and are deprecated.  Please use the C++ style constants defined above.
     */       
        FULL        = kFull,
        LONG        = kLong,
        MEDIUM        = kMedium,
        SHORT        = kShort,
        DEFAULT        = kDefault,
        DATE_OFFSET    = kDateOffset,
        NONE        = kNone,
        DATE_TIME    = kDateTime
    };

    /**
     * Destructor.
     * @stable
     */
    virtual ~DateFormat();

    /**
     * Equality operator.  Returns true if the two formats have the same behavior.
     * @stable
     */
    virtual UBool operator==(const Format&) const;

    /**
     * Format an object to produce a string. This method handles Formattable
     * objects with a UDate type. If a the Formattable object type is not a Date,
     * then it returns a failing UErrorCode.
     *
     * @param obj           The object to format. Must be a Date.
     * @param toAppendTo    The result of the formatting operation is appended to
     *                      this string.
     * @param pos           On input: an alignment field, if desired.
     *                      On output: the offsets of the alignment field.
     * @param status        Output param filled with success/failure status.
     * @return              The value passed in as toAppendTo (this allows chaining,
     *                      as with UnicodeString::append())
     * @draft
     */
    virtual UnicodeString& format(const Formattable& obj,
                                  UnicodeString& toAppendTo,
                                  FieldPosition& pos,
                                  UErrorCode& status) const;

    /**
     * Formats a UDate into a date/time string. This is an abstract method which
     * concrete subclasses must implement.
     * <P>
     * On input, the FieldPosition parameter may have its "field" member filled with
     * an enum value specifying a field.  On output, the FieldPosition will be filled
     * in with the text offsets for that field.  
     * <P> For example, given a time text
     * "1996.07.10 AD at 15:08:56 PDT", if the given fieldPosition.field is
     * DateFormat::kYearField, the offsets fieldPosition.beginIndex and
     * statfieldPositionus.getEndIndex will be set to 0 and 4, respectively. 
     * <P> Notice
     * that if the same time field appears more than once in a pattern, the status will
     * be set for the first occurence of that time field. For instance,
     * formatting a UDate to the time string "1 PM PDT (Pacific Daylight Time)"
     * using the pattern "h a z (zzzz)" and the alignment field
     * DateFormat::TIMEZONE_FIELD, the offsets fieldPosition.beginIndex and
     * fieldPosition.getEndIndex will be set to 5 and 8, respectively, for the first
     * occurence of the timezone pattern character 'z'.
     *
     * @param date          a UDate to be formatted into a date/time string.
     * @param toAppendTo    the result of the formatting operation is appended to
     *                      the end of this string.
     * @param fieldPosition On input: an alignment field, if desired (see examples above)
     *                      On output: the offsets of the alignment field (see examples above)
     * @return              A reference to 'toAppendTo'.
     * @draft
     */
    virtual UnicodeString& format(  UDate date,
                                    UnicodeString& toAppendTo,
                                    FieldPosition& fieldPosition) const = 0;

    /**
     * Formats a UDate into a date/time string. If there is a problem, you won't
     * know, using this method. Use the overloaded format() method which takes a
     * FieldPosition& to detect formatting problems.
     *
     * @param date      The UDate value to be formatted into a string.
     * @param result    Output param which will receive the formatted date.
     * @return          A reference to 'result'.
     * @draft
     */
    UnicodeString& format(UDate date, UnicodeString& result) const;

    /**
     * Redeclared Format method.
     * @draft
     */
    UnicodeString& format(const Formattable& obj,
                          UnicodeString& result,
                          UErrorCode& status) const;

    /**
     * Parse a date/time string.
     *
     * @param text      The string to be parsed into a UDate value.
     * @param status    Output param to be set to success/failure code. If
     *                  'text' cannot be parsed, it will be set to a failure
     *                  code.
     * @result          The parsed UDate value, if successful.
     * @draft
     */
    virtual UDate parse( const UnicodeString& text,
                        UErrorCode& status) const;

    /**
     * Parse a date/time string beginning at the given parse position. For
     * example, a time text "07/10/96 4:5 PM, PDT" will be parsed into a Date
     * that is equivalent to Date(837039928046).
     * <P>
     * By default, parsing is lenient: If the input is not in the form used by
     * this object's format method but can still be parsed as a date, then the
     * parse succeeds. Clients may insist on strict adherence to the format by
     * calling setLenient(false).
     *
     * @see DateFormat::setLenient(boolean)
     *
     * @param text  The date/time string to be parsed
     * @param pos   On input, the position at which to start parsing; on
     *              output, the position at which parsing terminated, or the
     *              start position if the parse failed.
     * @return      A valid UDate if the input could be parsed.
     * @draft
     */
    virtual UDate parse( const UnicodeString& text,
                        ParsePosition& pos) const = 0;

    /**
     * Parse a string to produce an object. This methods handles parsing of
     * date/time strings into Formattable objects with UDate types.
     * <P>
     * Before calling, set parse_pos.index to the offset you want to start
     * parsing at in the source. After calling, parse_pos.index is the end of
     * the text you parsed. If error occurs, index is unchanged.
     * <P>
     * When parsing, leading whitespace is discarded (with a successful parse),
     * while trailing whitespace is left as is.
     * <P>
     * See Format::parseObject() for more.
     *
     * @param source    The string to be parsed into an object.
     * @param result    Formattable to be set to the parse result.
     *                  If parse fails, return contents are undefined.
     * @param parse_pos The position to start parsing at. Upon return
     *                  this param is set to the position after the
     *                  last character successfully parsed. If the
     *                  source is not parsed successfully, this param
     *                  will remain unchanged.
     * @return          A newly created Formattable* object, or NULL
     *                  on failure.  The caller owns this and should
     *                  delete it when done.
     * @draft
     */
    virtual void parseObject(const UnicodeString& source,
                             Formattable& result,
                             ParsePosition& parse_pos) const;

    /**
     * Create a default date/time formatter that uses the SHORT style for both
     * the date and the time.
     *
     * @return A date/time formatter which the caller owns.
     * @stable
     */
    static DateFormat* createInstance(void);

    /**
     * Creates a time formatter with the given formatting style for the given
     * locale.
     * 
     * @param style     The given formatting style. For example,
     *                  SHORT for "h:mm a" in the US locale.
     * @param aLocale   The given locale.
     * @return          A time formatter which the caller owns.
     * @stable
     */
    static DateFormat* createTimeInstance(EStyle style = kDefault,
                                          const Locale& aLocale = Locale::getDefault());

    /**
     * Creates a date formatter with the given formatting style for the given
     * const locale.
     * 
     * @param style     The given formatting style. For example,
     *                  SHORT for "M/d/yy" in the US locale.
     * @param aLocale   The given locale.
     * @return          A date formatter which the caller owns.
     * @stable
     */
    static DateFormat* createDateInstance(EStyle style = kDefault,
                                          const Locale& aLocale = Locale::getDefault());

    /**
     * Creates a date/time formatter with the given formatting styles for the
     * given locale.
     * 
     * @param dateStyle The given formatting style for the date portion of the result.
     *                  For example, SHORT for "M/d/yy" in the US locale.
     * @param timeStyle The given formatting style for the time portion of the result.
     *                  For example, SHORT for "h:mm a" in the US locale.
     * @param aLocale   The given locale.
     * @return          A date/time formatter which the caller owns.
     * @stable
     */
    static DateFormat* createDateTimeInstance(EStyle dateStyle = kDefault,
                                              EStyle timeStyle = kDefault,
                                              const Locale& aLocale = Locale::getDefault());

    /**
     * Gets the set of locales for which DateFormats are installed.
     * @param count Filled in with the number of locales in the list that is returned.
     * @return the set of locales for which DateFormats are installed.  The caller
     *  does NOT own this list and must not delete it.
     * @stable
     */
    static const Locale* getAvailableLocales(int32_t& count);
  
    /**
     * Returns true if the formatter is set for lenient parsing.
     * @stable
     */
    virtual UBool isLenient(void) const;

    /**
     * Specify whether or not date/time parsing is to be lenient. With lenient
     * parsing, the parser may use heuristics to interpret inputs that do not
     * precisely match this object's format. With strict parsing, inputs must
     * match this object's format.
     * @see Calendar::setLenient
     * @stable
     */
    virtual void setLenient(UBool lenient);
    
    /**
     * Gets the calendar associated with this date/time formatter.
     * @return the calendar associated with this date/time formatter.
     * @stable
     */
    virtual const Calendar* getCalendar(void) const;
    
    /**
     * Set the calendar to be used by this date format. Initially, the default
     * calendar for the specified or default locale is used.  The caller should
     * not delete the Calendar object after it is adopted by this call.
     * @stable
     */
    virtual void adoptCalendar(Calendar* calendarToAdopt);

    /**
     * Set the calendar to be used by this date format. Initially, the default
     * calendar for the specified or default locale is used.
     * @stable
     */
    virtual void setCalendar(const Calendar& newCalendar);

   
    /**
     * Gets the number formatter which this date/time formatter uses to format
     * and parse the numeric portions of the pattern.
     * @return the number formatter which this date/time formatter uses.
     * @stable
     */
    virtual const NumberFormat* getNumberFormat(void) const;
    
    /**
     * Allows you to set the number formatter.  The caller should
     * not delete the NumberFormat object after it is adopted by this call.
     * @param formatToAdopt     NumberFormat object to be adopted.
     * @stable
     */
    virtual void adoptNumberFormat(NumberFormat* formatToAdopt);

    /**
     * Allows you to set the number formatter.
     * @param formatToAdopt     NumberFormat object to be adopted.
     * @stable
     */
    virtual void setNumberFormat(const NumberFormat& newNumberFormat);

    /**
     * Returns a reference to the TimeZone used by this DateFormat's calendar.
     * @return the time zone associated with the calendar of DateFormat.
     * @stable
     */
    virtual const TimeZone& getTimeZone(void) const;
    
    /**
     * Sets the time zone for the calendar of this DateFormat object. The caller
     * no longer owns the TimeZone object and should not delete it after this call.
     * @param zone the new time zone.
     * @stable
     */
    virtual void adoptTimeZone(TimeZone* zoneToAdopt);

    /**
     * Sets the time zone for the calendar of this DateFormat object.
     * @param zone the new time zone.
     * @stable
     */
    virtual void setTimeZone(const TimeZone& zone);

    
protected:
    /**
     * Default constructor.  Creates a DateFormat with no Calendar or NumberFormat
     * associated with it.  This constructor depends on the subclasses to fill in
     * the calendar and numberFormat fields.
     * @stable
     */
    DateFormat();

    /**
     * Copy constructor.
     * @stable
     */
    DateFormat(const DateFormat&);

    /**
     * Default assignment operator.
     * @stable
     */
    DateFormat& operator=(const DateFormat&);

    /**
     * The calendar that DateFormat uses to produce the time field values needed
     * to implement date/time formatting. Subclasses should generally initialize
     * this to the default calendar for the locale associated with this DateFormat.
     */
    Calendar* fCalendar;

    /**
     * The number formatter that DateFormat uses to format numbers in dates and
     * times. Subclasses should generally initialize this to the default number
     * format for the locale associated with this DateFormat.
     */
    NumberFormat* fNumberFormat;

private:
    /**
     * Gets the date/time formatter with the given formatting styles for the
     * given locale.
     * @param dateStyle the given date formatting style.
     * @param timeStyle the given time formatting style.
     * @param inLocale the given locale.
     * @return a date/time formatter, or 0 on failure.
     */
    static DateFormat* create(EStyle timeStyle, EStyle dateStyle, const Locale&);

    /**
     * fgLocales and fgLocalesCount cache the available locales array that is returned
     * by getAvailableLocales().
     */
    static int32_t          fgLocalesCount;

    /**
     * fgLocales and fgLocalesCount cache the available locales array that is returned
     * by getAvailableLocales().
     */
    static const Locale*    fgLocales;
};

inline UnicodeString&
DateFormat::format(const Formattable& obj,
                   UnicodeString& result,
                   UErrorCode& status) const {
    return Format::format(obj, result, status);
}

#endif // _DATEFMT
//eof
