/*
********************************************************************************
*   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,          // 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
    {
        kFull,
        kLong,
        kMedium,
        kShort,

        kDefault     = kMedium,
        kDateOffset = 4,
        kNone         = -1,
        kDateTime     = 8,
        
        
    /**
     * 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 bool_t 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 bool_t 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(bool_t 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
