// 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.
type RegulatoryDomain = table {
    /// ISO 3166-1 alpha-2, a two-letter code representing a domain of operation.
    /// (https://www.iso.org/publication/PUB500001.html)
    1: country_code string;
};

/// 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.
type LocaleId = struct {
    /// 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
    id string;
};

/// Typed identifier for a single calendar system. Currently consists only of a calendar ID.
type CalendarId = struct {
    /// 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"
    id string;
};

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

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

/// Selection of [temperature units](https://en.wikipedia.org/wiki/Degree_(temperature)).
type TemperatureUnit = strict enum {
    /// 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`.
type Profile = table {
    /// 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: locales vector<LocaleId>;

    /// 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: calendars vector<CalendarId>;

    /// 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: time_zones vector<TimeZoneId>;

    /// 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: temperature_unit TemperatureUnit;

    // TODO(https://fxbug.dev/42116645): 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)
};
