/*
* Copyright 2015, Yahoo Inc.
* Copyrights licensed under the New BSD License.
* See the accompanying LICENSE file for terms.
*/

import PropTypes from 'prop-types';

const {bool, number, string, func, object, oneOf, shape, any} = PropTypes;
const localeMatcher = oneOf(['best fit', 'lookup']);
const narrowShortLong = oneOf(['narrow', 'short', 'long']);
const numeric2digit = oneOf(['numeric', '2-digit']);
const funcReq = func.isRequired;

export const intlConfigPropTypes = {
  locale       : string,
  formats      : object,
  messages     : object,
  textComponent: any,

  defaultLocale : string,
  defaultFormats: object,
};

export const intlFormatPropTypes = {
  formatDate       : funcReq,
  formatTime       : funcReq,
  formatRelative   : funcReq,
  formatNumber     : funcReq,
  formatPlural     : funcReq,
  formatMessage    : funcReq,
  formatHTMLMessage: funcReq,
};

export const intlShape = shape({
  ...intlConfigPropTypes,
  ...intlFormatPropTypes,
  formatters: object,
  now: funcReq,
});

export const messageDescriptorPropTypes = {
  id            : string.isRequired,
  description   : string,
  defaultMessage: string,
};

export const dateTimeFormatPropTypes = {
  localeMatcher,
  formatMatcher: oneOf(['basic', 'best fit']),

  timeZone: string,
  hour12  : bool,

  weekday     : narrowShortLong,
  era         : narrowShortLong,
  year        : numeric2digit,
  month       : oneOf(['numeric', '2-digit', 'narrow', 'short', 'long']),
  day         : numeric2digit,
  hour        : numeric2digit,
  minute      : numeric2digit,
  second      : numeric2digit,
  timeZoneName: oneOf(['short', 'long']),
};

export const numberFormatPropTypes = {
  localeMatcher,

  style          : oneOf(['decimal', 'currency', 'percent']),
  currency       : string,
  currencyDisplay: oneOf(['symbol', 'code', 'name']),
  useGrouping    : bool,

  minimumIntegerDigits    : number,
  minimumFractionDigits   : number,
  maximumFractionDigits   : number,
  minimumSignificantDigits: number,
  maximumSignificantDigits: number,
};

export const relativeFormatPropTypes = {
  style: oneOf(['best fit', 'numeric']),
  units: oneOf(['second', 'minute', 'hour', 'day', 'month', 'year']),
};

export const pluralFormatPropTypes = {
  style: oneOf(['cardinal', 'ordinal']),
};