// Copyright 2019 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.

#ifndef SRC_LIB_INTL_INTL_PROPERTY_PROVIDER_IMPL_LOCALE_UTIL_H_
#define SRC_LIB_INTL_INTL_PROPERTY_PROVIDER_IMPL_LOCALE_UTIL_H_

#include <fuchsia/intl/cpp/fidl.h>
#include <lib/fpromise/result.h>

#include <string>

#include "src/lib/intl/intl_property_provider_impl/icu_headers.h"

namespace intl {

struct LocaleKeys {
  static const std::string kCalendar;
  static const std::string kFirstDayOfWeek;
  static const std::string kHourCycle;
  static const std::string kMeasurementSystem;
  static const std::string kNumbers;
  static const std::string kTimeZone;
};

// Convert the given locale ID to an `icu::Locale`.
fpromise::result<icu::Locale, zx_status_t> LocaleIdToIcuLocale(
    const fuchsia::intl::LocaleId& locale_id,
    const std::map<std::string, std::string>& unicode_extensions = {});

// Convert the given locale ID to an `icu::Locale`.
//
// Parameters:
//   locale_id: A Unicode BCP-47 Locale ID
//   unicode_extensions: Optional Unicode extension keys and values to add to
//     the locale.
fpromise::result<icu::Locale, zx_status_t> LocaleIdToIcuLocale(
    const std::string& locale_id,
    const std::map<std::string, std::string>& unicode_extensions = {});

// For the given `icu::Locale`, generate a Unicode BCP-47 Locale ID that
// includes extension keys and values for supported Unicode extensions.
fpromise::result<fuchsia::intl::LocaleId, zx_status_t> ExpandLocaleId(
    const icu::Locale& icu_locale);

// Extract just the calendar value from a `CalendarId`, which is of the form
// `"und-u-ca-<calendarid>"`.
fpromise::result<std::string, zx_status_t> ExtractBcp47CalendarId(
    const fuchsia::intl::CalendarId& calendar_id);

// Get a Unicode locale ID extension value ("sun", "mon", "tue", etc.) for the
// given day of the week. Used for "First day of week" extension in locale IDs.
//
// See
// https://github.com/unicode-org/cldr/blob/HEAD/common/bcp47/calendar.xml.
std::string ToDayOfWeekString(UCalendarDaysOfWeek day_of_week);

}  // namespace intl

#endif  // SRC_LIB_INTL_INTL_PROPERTY_PROVIDER_IMPL_LOCALE_UTIL_H_
