// 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
    /// 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 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 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(CF-168): 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)
};
