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

package com.ibm.icu.impl.duration.impl;

import  com.ibm.icu.impl.duration.DateFormatter;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

/**
 * A DateFormatter that formats the requested date fields.
 */
public class YMDDateFormatter implements DateFormatter {
  private String requestedFields;
  private String localeName;
  private TimeZone timeZone;
  private SimpleDateFormat df; // cache

  /**
   * Creates a new formatter that formats the requested 
   * fields.  The formatter defaults to the current locale
   * and time zone.
   *
   * @param requestedFields the requested fields
   */
  public YMDDateFormatter(String requestedFields) {
    this(requestedFields, Locale.getDefault().toString(),
         TimeZone.getDefault());
  }

  /**
   * Creates a new formatter that formats the requested 
   * fields using the provided locale and time zone.
   *
   * @param requestedFields the requested fields
   * @param localeName the locale to use
   * @param timeZone the time zone to use
   */
  public YMDDateFormatter(String requestedFields, String localeName, 
                             TimeZone timeZone) {
    this.requestedFields = requestedFields;
    this.localeName = localeName;
    this.timeZone = timeZone;

    Locale locale = Utils.localeFromString(localeName);
    this.df = new SimpleDateFormat("yyyy/mm/dd", locale);
    this.df.setTimeZone(timeZone);
  }

  /**
   * Returns a string representing the formatted date.
   * @param date the date in milliseconds
   */
  public String format(long date) {
    return format(new Date(date));
  }

  /**
   * Returns a string representing the formatted date.
   * @param date the date
   */
  public String format(Date date) {
    synchronized (this) {
      if (df == null) {
        // ignores requested fields
        // todo: make this really work
      }
    }
    return df.format(date);
  }

  /**
   * Returns a version of this formatter customized to the provided locale.
   */
  public DateFormatter withLocale(String localeName) {
    if (!localeName.equals(this.localeName)) {
      return new YMDDateFormatter(requestedFields, localeName, timeZone);
    }
    return this;
  }

  /**
   * Returns a version of this formatter customized to the provided time zone.
   */
  public DateFormatter withTimeZone(TimeZone timeZone) {
    if (!timeZone.equals(this.timeZone)) {
      return new YMDDateFormatter(requestedFields, localeName, timeZone);
    }
    return this;
  }
}
