/*
Copyright 2017 Vector Creations Ltd

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

const PHONE_NUMBER_REGEXP = /^[0-9 -.]+$/;

/*
 * Do basic validation to determine if the given input could be
 * a valid phone number.
 *
 * @param {String} phoneNumber The string to validate. This could be
 *     either an international format number (MSISDN or e.164) or
 *     a national-format number.
 * @return True if the number could be a valid phone number, otherwise false.
 */
export function looksValid(phoneNumber: string): boolean {
    return PHONE_NUMBER_REGEXP.test(phoneNumber);
}

// Regional Indicator Symbol Letter A
const UNICODE_BASE = 127462 - "A".charCodeAt(0);
// Country code should be exactly 2 uppercase characters
const COUNTRY_CODE_REGEX = /^[A-Z]{2}$/;

export const getEmojiFlag = (countryCode: string): string => {
    if (!COUNTRY_CODE_REGEX.test(countryCode)) return "";
    // Rip the country code out of the emoji and use that
    return String.fromCodePoint(...countryCode.split("").map((l) => UNICODE_BASE + l.charCodeAt(0)));
};

// Use https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames to get name
export interface PhoneNumberCountryDefinition {
    iso2: string;
    prefix: string;
}

export const COUNTRIES: PhoneNumberCountryDefinition[] = [
    {
        iso2: "GB",
        prefix: "44",
    },
    {
        iso2: "US",
        prefix: "1",
    },
    {
        iso2: "AF",
        prefix: "93",
    },
    {
        iso2: "AX",
        prefix: "358",
    },
    {
        iso2: "AL",
        prefix: "355",
    },
    {
        iso2: "DZ",
        prefix: "213",
    },
    {
        iso2: "AS",
        prefix: "1",
    },
    {
        iso2: "AD",
        prefix: "376",
    },
    {
        iso2: "AO",
        prefix: "244",
    },
    {
        iso2: "AI",
        prefix: "1",
    },
    {
        iso2: "AQ",
        prefix: "672",
    },
    {
        iso2: "AG",
        prefix: "1",
    },
    {
        iso2: "AR",
        prefix: "54",
    },
    {
        iso2: "AM",
        prefix: "374",
    },
    {
        iso2: "AW",
        prefix: "297",
    },
    {
        iso2: "AU",
        prefix: "61",
    },
    {
        iso2: "AT",
        prefix: "43",
    },
    {
        iso2: "AZ",
        prefix: "994",
    },
    {
        iso2: "BS",
        prefix: "1",
    },
    {
        iso2: "BH",
        prefix: "973",
    },
    {
        iso2: "BD",
        prefix: "880",
    },
    {
        iso2: "BB",
        prefix: "1",
    },
    {
        iso2: "BY",
        prefix: "375",
    },
    {
        iso2: "BE",
        prefix: "32",
    },
    {
        iso2: "BZ",
        prefix: "501",
    },
    {
        iso2: "BJ",
        prefix: "229",
    },
    {
        iso2: "BM",
        prefix: "1",
    },
    {
        iso2: "BT",
        prefix: "975",
    },
    {
        iso2: "BO",
        prefix: "591",
    },
    {
        iso2: "BA",
        prefix: "387",
    },
    {
        iso2: "BW",
        prefix: "267",
    },
    {
        iso2: "BV",
        prefix: "47",
    },
    {
        iso2: "BR",
        prefix: "55",
    },
    {
        iso2: "IO",
        prefix: "246",
    },
    {
        iso2: "VG",
        prefix: "1",
    },
    {
        iso2: "BN",
        prefix: "673",
    },
    {
        iso2: "BG",
        prefix: "359",
    },
    {
        iso2: "BF",
        prefix: "226",
    },
    {
        iso2: "BI",
        prefix: "257",
    },
    {
        iso2: "KH",
        prefix: "855",
    },
    {
        iso2: "CM",
        prefix: "237",
    },
    {
        iso2: "CA",
        prefix: "1",
    },
    {
        iso2: "CV",
        prefix: "238",
    },
    {
        iso2: "BQ",
        prefix: "599",
    },
    {
        iso2: "KY",
        prefix: "1",
    },
    {
        iso2: "CF",
        prefix: "236",
    },
    {
        iso2: "TD",
        prefix: "235",
    },
    {
        iso2: "CL",
        prefix: "56",
    },
    {
        iso2: "CN",
        prefix: "86",
    },
    {
        iso2: "CX",
        prefix: "61",
    },
    {
        iso2: "CC",
        prefix: "61",
    },
    {
        iso2: "CO",
        prefix: "57",
    },
    {
        iso2: "KM",
        prefix: "269",
    },
    {
        iso2: "CG",
        prefix: "242",
    },
    {
        iso2: "CD",
        prefix: "243",
    },
    {
        iso2: "CK",
        prefix: "682",
    },
    {
        iso2: "CR",
        prefix: "506",
    },
    {
        iso2: "HR",
        prefix: "385",
    },
    {
        iso2: "CU",
        prefix: "53",
    },
    {
        iso2: "CW",
        prefix: "599",
    },
    {
        iso2: "CY",
        prefix: "357",
    },
    {
        iso2: "CZ",
        prefix: "420",
    },
    {
        iso2: "CI",
        prefix: "225",
    },
    {
        iso2: "DK",
        prefix: "45",
    },
    {
        iso2: "DJ",
        prefix: "253",
    },
    {
        iso2: "DM",
        prefix: "1",
    },
    {
        iso2: "DO",
        prefix: "1",
    },
    {
        iso2: "EC",
        prefix: "593",
    },
    {
        iso2: "EG",
        prefix: "20",
    },
    {
        iso2: "SV",
        prefix: "503",
    },
    {
        iso2: "GQ",
        prefix: "240",
    },
    {
        iso2: "ER",
        prefix: "291",
    },
    {
        iso2: "EE",
        prefix: "372",
    },
    {
        iso2: "ET",
        prefix: "251",
    },
    {
        iso2: "FK",
        prefix: "500",
    },
    {
        iso2: "FO",
        prefix: "298",
    },
    {
        iso2: "FJ",
        prefix: "679",
    },
    {
        iso2: "FI",
        prefix: "358",
    },
    {
        iso2: "FR",
        prefix: "33",
    },
    {
        iso2: "GF",
        prefix: "594",
    },
    {
        iso2: "PF",
        prefix: "689",
    },
    {
        iso2: "TF",
        prefix: "262",
    },
    {
        iso2: "GA",
        prefix: "241",
    },
    {
        iso2: "GM",
        prefix: "220",
    },
    {
        iso2: "GE",
        prefix: "995",
    },
    {
        iso2: "DE",
        prefix: "49",
    },
    {
        iso2: "GH",
        prefix: "233",
    },
    {
        iso2: "GI",
        prefix: "350",
    },
    {
        iso2: "GR",
        prefix: "30",
    },
    {
        iso2: "GL",
        prefix: "299",
    },
    {
        iso2: "GD",
        prefix: "1",
    },
    {
        iso2: "GP",
        prefix: "590",
    },
    {
        iso2: "GU",
        prefix: "1",
    },
    {
        iso2: "GT",
        prefix: "502",
    },
    {
        iso2: "GG",
        prefix: "44",
    },
    {
        iso2: "GN",
        prefix: "224",
    },
    {
        iso2: "GW",
        prefix: "245",
    },
    {
        iso2: "GY",
        prefix: "592",
    },
    {
        iso2: "HT",
        prefix: "509",
    },
    {
        iso2: "HM",
        prefix: "672",
    },
    {
        iso2: "HN",
        prefix: "504",
    },
    {
        iso2: "HK",
        prefix: "852",
    },
    {
        iso2: "HU",
        prefix: "36",
    },
    {
        iso2: "IS",
        prefix: "354",
    },
    {
        iso2: "IN",
        prefix: "91",
    },
    {
        iso2: "ID",
        prefix: "62",
    },
    {
        iso2: "IR",
        prefix: "98",
    },
    {
        iso2: "IQ",
        prefix: "964",
    },
    {
        iso2: "IE",
        prefix: "353",
    },
    {
        iso2: "IM",
        prefix: "44",
    },
    {
        iso2: "IL",
        prefix: "972",
    },
    {
        iso2: "IT",
        prefix: "39",
    },
    {
        iso2: "JM",
        prefix: "1",
    },
    {
        iso2: "JP",
        prefix: "81",
    },
    {
        iso2: "JE",
        prefix: "44",
    },
    {
        iso2: "JO",
        prefix: "962",
    },
    {
        iso2: "KZ",
        prefix: "7",
    },
    {
        iso2: "KE",
        prefix: "254",
    },
    {
        iso2: "KI",
        prefix: "686",
    },
    {
        iso2: "XK",
        prefix: "383",
    },
    {
        iso2: "KW",
        prefix: "965",
    },
    {
        iso2: "KG",
        prefix: "996",
    },
    {
        iso2: "LA",
        prefix: "856",
    },
    {
        iso2: "LV",
        prefix: "371",
    },
    {
        iso2: "LB",
        prefix: "961",
    },
    {
        iso2: "LS",
        prefix: "266",
    },
    {
        iso2: "LR",
        prefix: "231",
    },
    {
        iso2: "LY",
        prefix: "218",
    },
    {
        iso2: "LI",
        prefix: "423",
    },
    {
        iso2: "LT",
        prefix: "370",
    },
    {
        iso2: "LU",
        prefix: "352",
    },
    {
        iso2: "MO",
        prefix: "853",
    },
    {
        iso2: "MK",
        prefix: "389",
    },
    {
        iso2: "MG",
        prefix: "261",
    },
    {
        iso2: "MW",
        prefix: "265",
    },
    {
        iso2: "MY",
        prefix: "60",
    },
    {
        iso2: "MV",
        prefix: "960",
    },
    {
        iso2: "ML",
        prefix: "223",
    },
    {
        iso2: "MT",
        prefix: "356",
    },
    {
        iso2: "MH",
        prefix: "692",
    },
    {
        iso2: "MQ",
        prefix: "596",
    },
    {
        iso2: "MR",
        prefix: "222",
    },
    {
        iso2: "MU",
        prefix: "230",
    },
    {
        iso2: "YT",
        prefix: "262",
    },
    {
        iso2: "MX",
        prefix: "52",
    },
    {
        iso2: "FM",
        prefix: "691",
    },
    {
        iso2: "MD",
        prefix: "373",
    },
    {
        iso2: "MC",
        prefix: "377",
    },
    {
        iso2: "MN",
        prefix: "976",
    },
    {
        iso2: "ME",
        prefix: "382",
    },
    {
        iso2: "MS",
        prefix: "1",
    },
    {
        iso2: "MA",
        prefix: "212",
    },
    {
        iso2: "MZ",
        prefix: "258",
    },
    {
        iso2: "MM",
        prefix: "95",
    },
    {
        iso2: "NA",
        prefix: "264",
    },
    {
        iso2: "NR",
        prefix: "674",
    },
    {
        iso2: "NP",
        prefix: "977",
    },
    {
        iso2: "NL",
        prefix: "31",
    },
    {
        iso2: "NC",
        prefix: "687",
    },
    {
        iso2: "NZ",
        prefix: "64",
    },
    {
        iso2: "NI",
        prefix: "505",
    },
    {
        iso2: "NE",
        prefix: "227",
    },
    {
        iso2: "NG",
        prefix: "234",
    },
    {
        iso2: "NU",
        prefix: "683",
    },
    {
        iso2: "NF",
        prefix: "672",
    },
    {
        iso2: "KP",
        prefix: "850",
    },
    {
        iso2: "MP",
        prefix: "1",
    },
    {
        iso2: "NO",
        prefix: "47",
    },
    {
        iso2: "OM",
        prefix: "968",
    },
    {
        iso2: "PK",
        prefix: "92",
    },
    {
        iso2: "PW",
        prefix: "680",
    },
    {
        iso2: "PS",
        prefix: "970",
    },
    {
        iso2: "PA",
        prefix: "507",
    },
    {
        iso2: "PG",
        prefix: "675",
    },
    {
        iso2: "PY",
        prefix: "595",
    },
    {
        iso2: "PE",
        prefix: "51",
    },
    {
        iso2: "PH",
        prefix: "63",
    },
    {
        iso2: "PN",
        prefix: "870",
    },
    {
        iso2: "PL",
        prefix: "48",
    },
    {
        iso2: "PT",
        prefix: "351",
    },
    {
        iso2: "PR",
        prefix: "1",
    },
    {
        iso2: "QA",
        prefix: "974",
    },
    {
        iso2: "RO",
        prefix: "40",
    },
    {
        iso2: "RU",
        prefix: "7",
    },
    {
        iso2: "RW",
        prefix: "250",
    },
    {
        iso2: "RE",
        prefix: "262",
    },
    {
        iso2: "WS",
        prefix: "685",
    },
    {
        iso2: "SM",
        prefix: "378",
    },
    {
        iso2: "SA",
        prefix: "966",
    },
    {
        iso2: "SN",
        prefix: "221",
    },
    {
        iso2: "RS",
        prefix: "381 p",
    },
    {
        iso2: "SC",
        prefix: "248",
    },
    {
        iso2: "SL",
        prefix: "232",
    },
    {
        iso2: "SG",
        prefix: "65",
    },
    {
        iso2: "SX",
        prefix: "1",
    },
    {
        iso2: "SK",
        prefix: "421",
    },
    {
        iso2: "SI",
        prefix: "386",
    },
    {
        iso2: "SB",
        prefix: "677",
    },
    {
        iso2: "SO",
        prefix: "252",
    },
    {
        iso2: "ZA",
        prefix: "27",
    },
    {
        iso2: "GS",
        prefix: "500",
    },
    {
        iso2: "KR",
        prefix: "82",
    },
    {
        iso2: "SS",
        prefix: "211",
    },
    {
        iso2: "ES",
        prefix: "34",
    },
    {
        iso2: "LK",
        prefix: "94",
    },
    {
        iso2: "BL",
        prefix: "590",
    },
    {
        iso2: "SH",
        prefix: "290 n",
    },
    {
        iso2: "KN",
        prefix: "1",
    },
    {
        iso2: "LC",
        prefix: "1",
    },
    {
        iso2: "MF",
        prefix: "590",
    },
    {
        iso2: "PM",
        prefix: "508",
    },
    {
        iso2: "VC",
        prefix: "1",
    },
    {
        iso2: "SD",
        prefix: "249",
    },
    {
        iso2: "SR",
        prefix: "597",
    },
    {
        iso2: "SJ",
        prefix: "47",
    },
    {
        iso2: "SZ",
        prefix: "268",
    },
    {
        iso2: "SE",
        prefix: "46",
    },
    {
        iso2: "CH",
        prefix: "41",
    },
    {
        iso2: "SY",
        prefix: "963",
    },
    {
        iso2: "ST",
        prefix: "239",
    },
    {
        iso2: "TW",
        prefix: "886",
    },
    {
        iso2: "TJ",
        prefix: "992",
    },
    {
        iso2: "TZ",
        prefix: "255",
    },
    {
        iso2: "TH",
        prefix: "66",
    },
    {
        iso2: "TL",
        prefix: "670",
    },
    {
        iso2: "TG",
        prefix: "228",
    },
    {
        iso2: "TK",
        prefix: "690",
    },
    {
        iso2: "TO",
        prefix: "676",
    },
    {
        iso2: "TT",
        prefix: "1",
    },
    {
        iso2: "TN",
        prefix: "216",
    },
    {
        iso2: "TR",
        prefix: "90",
    },
    {
        iso2: "TM",
        prefix: "993",
    },
    {
        iso2: "TC",
        prefix: "1",
    },
    {
        iso2: "TV",
        prefix: "688",
    },
    {
        iso2: "VI",
        prefix: "1",
    },
    {
        iso2: "UG",
        prefix: "256",
    },
    {
        iso2: "UA",
        prefix: "380",
    },
    {
        iso2: "AE",
        prefix: "971",
    },
    {
        iso2: "UY",
        prefix: "598",
    },
    {
        iso2: "UZ",
        prefix: "998",
    },
    {
        iso2: "VU",
        prefix: "678",
    },
    {
        iso2: "VA",
        prefix: "39",
    },
    {
        iso2: "VE",
        prefix: "58",
    },
    {
        iso2: "VN",
        prefix: "84",
    },
    {
        iso2: "WF",
        prefix: "681",
    },
    {
        iso2: "EH",
        prefix: "212",
    },
    {
        iso2: "YE",
        prefix: "967",
    },
    {
        iso2: "ZM",
        prefix: "260",
    },
    {
        iso2: "ZW",
        prefix: "263",
    },
];
