// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
******************************************************************************
* Copyright (C) 2009, International Business Machines Corporation and   *
* others. All Rights Reserved.                                               *
******************************************************************************
*/

package com.ibm.icu.impl.duration;

import java.util.TimeZone;

/**
 * Factory used to construct DurationFormatters.
 * Formatters are immutable once created.
 * <p>
 * Setters on the factory mutate the factory and return it,
 * for chaining.
 */
public interface DurationFormatterFactory {

  /**
   * Set the period formatter used by the factory.  New formatters created
   * with this factory will use the given period formatter.
   *
   * @param formatter the formatter to use
   * @return this DurationFormatterFactory
   */
  public DurationFormatterFactory setPeriodFormatter(PeriodFormatter formatter);

  /**
   * Set the builder used by the factory.  New formatters created
   * with this factory will use the given locale.
   *
   * @param builder the builder to use
   * @return this DurationFormatterFactory
   */
  public DurationFormatterFactory setPeriodBuilder(PeriodBuilder builder);

  /**
   * Set a fallback formatter for durations over a given limit.
   *
   * @param fallback the fallback formatter to use, or null
   * @return this DurationFormatterFactory
   */
  public DurationFormatterFactory setFallback(DateFormatter fallback);

  /**
   * Set a fallback limit for durations over a given limit.
   *
   * @param fallbackLimit the fallback limit to use, or 0 if none is desired.
   * @return this DurationFormatterFactory
   */
  public DurationFormatterFactory setFallbackLimit(long fallbackLimit);

  /**
   * Set the name of the locale that will be used when 
   * creating new formatters.
   *
   * @param localeName the name of the Locale
   * @return this DurationFormatterFactory
   */
  public DurationFormatterFactory setLocale(String localeName);

  /**
   * Set the name of the locale that will be used when 
   * creating new formatters.
   *
   * @param timeZone The time zone to set.
   * @return this DurationFormatterFactory
   */
  public DurationFormatterFactory setTimeZone(TimeZone timeZone);

  /**
   * Return a formatter based on this factory's current settings.
   *
   * @return a DurationFormatter
   */
  public DurationFormatter getFormatter();
}
