// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.intl;

/// Typed identifier for a regulatory domain as specified in the IEEE 802.11 standard.
table RegulatoryDomain {
    /// ISO 3166-1 alpha-2, a two-letter code representing a domain of operation.
    /// (https://www.iso.org/publication/PUB500001.html)
    1: string country_code;
};

/// Typed identifier for a single Locale, which is a set of internationalization-related properties.
///
/// Most APIs that consume locales will probably want to accept a vector of locales to account for
/// priority.
struct LocaleId {
    /// Unicode BCP-47 Locale Identifier
    /// (http://www.unicode.org/reports/tr35/#BCP_47_Conformance).
    ///
    /// Must be canonicalized and well-formed. This field should not be populated from arbitrary
    /// user- or third-party input, but instead generated programmatically.
    ///
    /// Includes language, region, script, and variant, plus Unicode extensions (under the "u"
    /// singleton). Other extensions are allowed but ignored.
    ///
    /// Examples:
    ///   "en-US"
    ///     American English
    ///   "fr-u-hc-h12"
    ///     French, with 12-hour clock
    ///   "ar-EG-u-fw-mon-nu-latn"
    ///     Egyptian Arabic with "Latin" numerals and first day of week on Monday
    string id;
};

/// Typed identifier for a single calendar system. Currently consists only of a calendar ID.
struct CalendarId {
    /// Unicode BCP-47 Locale Identifier with an undefined language tag and a single extension
    /// specifying the calendar ID (from
    /// https://unicode.org/repos/cldr/trunk/common/bcp47/calendar.xml).
    ///
    /// Examples:
    ///   "und-u-ca-gregory"
    ///   "und-u-ca-islamic"
    string id;
};

/// This is the time zone reported when no time zones have been set.
const string DEFAULT_TIME_ZONE_ID = "UTC";

/// Typed identifier for a time zone.
struct TimeZoneId {
    /// Time zone ID from tzdata, e.g. "America/New_York". See https://www.iana.org/time-zones.
    string id;
};

/// Selection of [temperature units](https://en.wikipedia.org/wiki/Degree_(temperature)).
enum TemperatureUnit {
    /// The temperature should be formatted to show temperature in degrees Celsius.
    CELSIUS = 0;
    /// The temperature should be formatted to show temperature in degrees Fahrenheit.
    FAHRENHEIT = 1;
};

/// A collection of ranked internationalization properties.
///
/// There is no implied origin for this information; it might come from a user account, device
/// settings, a synthesis of user settings and app-specific overrides, or anywhere else.
///
/// Language-independent properties that are supported by Unicode BCP-47 Locale IDs (e.g.
/// first-day-of-week, time zone) are denormalized into the locale IDs in `locales`.
table Profile {
    /// Ranked list of locales (in descending order of preference).  The vector will always 
    /// be set, and always contain at least one element. For example,
    /// locales = [ LocaleId("en-US") ] is valid, but locales = [], or locales = <unset> is not.
    1: vector<LocaleId> locales;

    /// Ranked list of calendars (in descending order of preference).
    /// The first entry is the primary calendar, and will be equal to the calendar indicated
    /// in `locales`.
    /// The vector will always be set, and always contain at least one element.
    /// The list allows multiple ranked preferences, and is intended for use
    /// by applications that can display multiple calendar systems.
    2: vector<CalendarId> calendars;

    /// Ranked list of time zones (in descending order). The first entry is the primary time zone,
    /// which should be used by default for formatting dates and times; it will be equal to the
    /// calendar indicated in `locales`.
    /// The list is intended for use by applications that can display multiple time zones, e.g.
    /// a world clock.
    /// The vector will always be set, and always contain at least one element.
    /// On Fuchsia, the default time zone is always `DEFAULT_TIME_ZONE_ID` when
    /// no more specific time zones have been defined or selected.
    3: vector<TimeZoneId> time_zones;

    /// Selected temperature unit. The unit is always reported: if there is no
    /// setting in the current environment, the default value of CELSIUS is
    /// used.
    4: TemperatureUnit temperature_unit;

    // TODO(fxbug.dev/4065): Other properties that don't fit into locale IDs. Examples:
    // - User date format overrides, like d/mmm/y
    // - User currency overrides
    // - User number overrides (grouping, decimal point)
};
