/**
 * Functions to get first day of week.
 * 
 * @module api
 */


/**
 * Return first day of week for country/region code.
 *
 * @example
 * getWeekStartByRegion('PNG', {});   // 1
 * getWeekStartByRegion('png', {BR: 0, PNG: 3, EG: 6});   // 3
 * getWeekStartByRegion('qa', {QA: 6});   // 6
 * getWeekStartByRegion(50, {BD: 5, 50: 5, SD: 6});   // 5
 *
 * @param {number | string} regionCode
 *      ISO 3166 Alpha-2, Alpha-3 or numeric code.
 * @param {object} regionDayMap
 *      Mapping of country/region code to first day of week that should be used to get result.
 *      Country codes should be in upper case.
 * @return {number}
 *      Code of first day of week for the given country/region code:
 *      0 - Sunday, 1 - Monday, 2 - Tuesday, 3 - Wednesday, 4 - Thursday, 5 - Friday, 6 - Saturday.
 * @alias module:api.getWeekStartByRegion
 */
export function getWeekStartByRegion(regionCode, regionDayMap) {
    /* eslint-disable indent */
    const code = regionDayMap[typeof regionCode === 'string'
                                ? regionCode.toUpperCase()
                                : regionCode];
    /* eslint-enable indent */

    return typeof code === 'number'
        ? code
        : 1;
}

/**
 * Return first day of week for locale identifier.
 *
 * @example
 * getWeekStartByLocale('no', {}, {});   // 1
 * getWeekStartByLocale('no', {no: 'abc'}, {ABC: 3});   // 3
 * getWeekStartByLocale('KK_arab', {kk_arab: 'CN'}, {CN: 0});   // 0
 * getWeekStartByLocale('fr-DZ', {fr: 'FR'}, {FR: 1, DZ: 6});   // 6
 *
 * @param {string} locale
 *      Locale identifier.
 * @param {object} langRegionMap
 *      Mapping of language code to country/region code that should be used to get result.
 *      Language codes should be in lower case.
 * @param {object} regionDayMap
 *      Mapping of country/region code to first day of week that should be used to get result.
 *      Country codes should be in upper case.
 * @return {number}
 *      Code of first day of week for the given locale identifier:
 *      0 - Sunday, 1 - Monday, 2 - Tuesday, 3 - Wednesday, 4 - Thursday, 5 - Friday, 6 - Saturday.
 * @alias module:api.getWeekStartByLocale
 */
export function getWeekStartByLocale(locale, langRegionMap, regionDayMap) {
    if (locale) {
        // Locale form: http://www.unicode.org/reports/tr35/tr35.html#Unicode_Language_and_Locale_Identifiers
        const data = locale.toLowerCase().split(/[-_]/);
        const langTag = data[0];
        let language = langTag;
        let country;
        if (data[1] && data[1].length === 4) {
            language += `_${data[1]}`;
            country = data[2];
        }
        else {
            country = data[1];
        }
        if (! country) {
            country = langRegionMap[language] || langRegionMap[langTag];
        }
        if (country) {
            return getWeekStartByRegion(
                country.match(/^\d+$/)
                    ? Number(country)
                    : country,
                regionDayMap
            );
        }
    }

    return 1;
}
