/* Single source of truth for phone validation + flag selector.
   lengths = accepted national-number digit counts.
   mobileStart = optional leading-digit rule (e.g. Indian mobiles 6-9). */

export type Country = {
  iso: string;
  name: string;
  dial: string;
  lengths: number[];
  mobileStart?: RegExp;
};

const RANGE_7_15 = [7, 8, 9, 10, 11, 12, 13, 14, 15];

export const COUNTRIES: Country[] = [
  { iso: "IN", name: "India", dial: "91", lengths: [10], mobileStart: /^[6-9]/ },
  { iso: "US", name: "United States", dial: "1", lengths: [10] },
  { iso: "CA", name: "Canada", dial: "1", lengths: [10] },
  { iso: "GB", name: "United Kingdom", dial: "44", lengths: [10, 11] },
  { iso: "AE", name: "United Arab Emirates", dial: "971", lengths: [9] },
  { iso: "SA", name: "Saudi Arabia", dial: "966", lengths: [9, 10] },
  { iso: "QA", name: "Qatar", dial: "974", lengths: [8] },
  { iso: "KW", name: "Kuwait", dial: "965", lengths: [7, 8] },
  { iso: "OM", name: "Oman", dial: "968", lengths: [8] },
  { iso: "BH", name: "Bahrain", dial: "973", lengths: [8] },
  { iso: "SG", name: "Singapore", dial: "65", lengths: [8] },
  { iso: "MY", name: "Malaysia", dial: "60", lengths: [9, 10] },
  { iso: "AU", name: "Australia", dial: "61", lengths: [9, 10] },
  { iso: "NZ", name: "New Zealand", dial: "64", lengths: [8, 9, 10] },
  { iso: "DE", name: "Germany", dial: "49", lengths: [10, 11] },
  { iso: "FR", name: "France", dial: "33", lengths: [9] },
  { iso: "NL", name: "Netherlands", dial: "31", lengths: [9] },
  { iso: "IT", name: "Italy", dial: "39", lengths: [9, 10] },
  { iso: "ES", name: "Spain", dial: "34", lengths: [9] },
  { iso: "IE", name: "Ireland", dial: "353", lengths: [9, 10] },
  { iso: "CH", name: "Switzerland", dial: "41", lengths: [9] },
  { iso: "AT", name: "Austria", dial: "43", lengths: [10, 11] },
  { iso: "BE", name: "Belgium", dial: "32", lengths: [9, 10] },
  { iso: "SE", name: "Sweden", dial: "46", lengths: [9, 10] },
  { iso: "NO", name: "Norway", dial: "47", lengths: [8] },
  { iso: "DK", name: "Denmark", dial: "45", lengths: [8] },
  { iso: "FI", name: "Finland", dial: "358", lengths: [9, 10] },
  { iso: "PT", name: "Portugal", dial: "351", lengths: [9] },
  { iso: "GR", name: "Greece", dial: "30", lengths: [10] },
  { iso: "PL", name: "Poland", dial: "48", lengths: [9] },
  { iso: "ZA", name: "South Africa", dial: "27", lengths: [9] },
  { iso: "NG", name: "Nigeria", dial: "234", lengths: [10] },
  { iso: "KE", name: "Kenya", dial: "254", lengths: [9, 10] },
  { iso: "EG", name: "Egypt", dial: "20", lengths: [10] },
  { iso: "BR", name: "Brazil", dial: "55", lengths: [10, 11] },
  { iso: "MX", name: "Mexico", dial: "52", lengths: [10] },
  { iso: "AR", name: "Argentina", dial: "54", lengths: [10, 11] },
  { iso: "CL", name: "Chile", dial: "56", lengths: [9] },
  { iso: "CO", name: "Colombia", dial: "57", lengths: [10] },
  { iso: "PE", name: "Peru", dial: "51", lengths: [9] },
  { iso: "JP", name: "Japan", dial: "81", lengths: [10, 11] },
  { iso: "CN", name: "China", dial: "86", lengths: [11] },
  { iso: "KR", name: "South Korea", dial: "82", lengths: [10, 11] },
  { iso: "HK", name: "Hong Kong", dial: "852", lengths: [8] },
  { iso: "TW", name: "Taiwan", dial: "886", lengths: [9] },
  { iso: "TH", name: "Thailand", dial: "66", lengths: [9] },
  { iso: "VN", name: "Vietnam", dial: "84", lengths: [9, 10] },
  { iso: "ID", name: "Indonesia", dial: "62", lengths: [9, 10, 11] },
  { iso: "PH", name: "Philippines", dial: "63", lengths: [10] },
  { iso: "BD", name: "Bangladesh", dial: "880", lengths: [10] },
  { iso: "PK", name: "Pakistan", dial: "92", lengths: [10] },
  { iso: "LK", name: "Sri Lanka", dial: "94", lengths: [9] },
  { iso: "NP", name: "Nepal", dial: "977", lengths: [10] },
  { iso: "MM", name: "Myanmar", dial: "95", lengths: [8, 9, 10] },
  { iso: "KH", name: "Cambodia", dial: "855", lengths: [8, 9] },
  { iso: "LA", name: "Laos", dial: "856", lengths: [9, 10] },
  { iso: "MN", name: "Mongolia", dial: "976", lengths: [8] },
  { iso: "KZ", name: "Kazakhstan", dial: "7", lengths: [10] },
  { iso: "RU", name: "Russia", dial: "7", lengths: [10] },
  { iso: "UA", name: "Ukraine", dial: "380", lengths: [9] },
  { iso: "TR", name: "Turkey", dial: "90", lengths: [10] },
  { iso: "IL", name: "Israel", dial: "972", lengths: [9] },
  { iso: "JO", name: "Jordan", dial: "962", lengths: [9] },
  { iso: "LB", name: "Lebanon", dial: "961", lengths: [7, 8] },
  { iso: "IQ", name: "Iraq", dial: "964", lengths: [10] },
  { iso: "IR", name: "Iran", dial: "98", lengths: [10] },
  { iso: "AF", name: "Afghanistan", dial: "93", lengths: [9] },
  { iso: "UZ", name: "Uzbekistan", dial: "998", lengths: [9] },
  { iso: "AZ", name: "Azerbaijan", dial: "994", lengths: [9] },
  { iso: "GE", name: "Georgia", dial: "995", lengths: [9] },
  { iso: "AM", name: "Armenia", dial: "374", lengths: [8] },
  { iso: "BY", name: "Belarus", dial: "375", lengths: [9] },
  { iso: "MD", name: "Moldova", dial: "373", lengths: [8] },
  { iso: "RO", name: "Romania", dial: "40", lengths: [9, 10] },
  { iso: "HU", name: "Hungary", dial: "36", lengths: [9] },
  { iso: "CZ", name: "Czech Republic", dial: "420", lengths: [9] },
  { iso: "SK", name: "Slovakia", dial: "421", lengths: [9] },
  { iso: "BG", name: "Bulgaria", dial: "359", lengths: [9] },
  { iso: "HR", name: "Croatia", dial: "385", lengths: [8, 9] },
  { iso: "RS", name: "Serbia", dial: "381", lengths: [8, 9] },
  { iso: "SI", name: "Slovenia", dial: "386", lengths: [8] },
  { iso: "EE", name: "Estonia", dial: "372", lengths: [7, 8] },
  { iso: "LV", name: "Latvia", dial: "371", lengths: [8] },
  { iso: "LT", name: "Lithuania", dial: "370", lengths: [8] },
  { iso: "IS", name: "Iceland", dial: "354", lengths: [7] },
  { iso: "LU", name: "Luxembourg", dial: "352", lengths: [9] },
  { iso: "MT", name: "Malta", dial: "356", lengths: [8] },
  { iso: "CY", name: "Cyprus", dial: "357", lengths: [8] },
  { iso: "AL", name: "Albania", dial: "355", lengths: [9] },
  { iso: "MK", name: "North Macedonia", dial: "389", lengths: [8] },
  { iso: "BA", name: "Bosnia & Herzegovina", dial: "387", lengths: [8, 9] },
  { iso: "ME", name: "Montenegro", dial: "382", lengths: [8] },
  { iso: "DZ", name: "Algeria", dial: "213", lengths: [9] },
  { iso: "MA", name: "Morocco", dial: "212", lengths: [9] },
  { iso: "TN", name: "Tunisia", dial: "216", lengths: [8] },
  { iso: "LY", name: "Libya", dial: "218", lengths: [9, 10] },
  { iso: "SD", name: "Sudan", dial: "249", lengths: [9] },
  { iso: "ET", name: "Ethiopia", dial: "251", lengths: [9] },
  { iso: "SO", name: "Somalia", dial: "252", lengths: [8, 9] },
  { iso: "DJ", name: "Djibouti", dial: "253", lengths: [8] },
  { iso: "UG", name: "Uganda", dial: "256", lengths: [9] },
  { iso: "TZ", name: "Tanzania", dial: "255", lengths: [9] },
  { iso: "RW", name: "Rwanda", dial: "250", lengths: [9] },
  { iso: "GH", name: "Ghana", dial: "233", lengths: [9] },
  { iso: "SN", name: "Senegal", dial: "221", lengths: [9] },
  { iso: "CI", name: "Ivory Coast", dial: "225", lengths: [8, 10] },
  { iso: "CM", name: "Cameroon", dial: "237", lengths: [9] },
  { iso: "CD", name: "DR Congo", dial: "243", lengths: [9] },
  { iso: "CG", name: "Congo Republic", dial: "242", lengths: [9] },
  { iso: "AO", name: "Angola", dial: "244", lengths: [9] },
  { iso: "MZ", name: "Mozambique", dial: "258", lengths: [9] },
  { iso: "ZW", name: "Zimbabwe", dial: "263", lengths: [9] },
  { iso: "ZM", name: "Zambia", dial: "260", lengths: [9] },
  { iso: "BW", name: "Botswana", dial: "267", lengths: [7, 8] },
  { iso: "NA", name: "Namibia", dial: "264", lengths: [9] },
  { iso: "MU", name: "Mauritius", dial: "230", lengths: [7, 8] },
  { iso: "MG", name: "Madagascar", dial: "261", lengths: [9] },
  { iso: "ML", name: "Mali", dial: "223", lengths: [8] },
  { iso: "BF", name: "Burkina Faso", dial: "226", lengths: [8] },
  { iso: "NE", name: "Niger", dial: "227", lengths: [8] },
  { iso: "TD", name: "Chad", dial: "235", lengths: [8] },
  { iso: "MR", name: "Mauritania", dial: "222", lengths: [8] },
  { iso: "GM", name: "Gambia", dial: "220", lengths: [7] },
  { iso: "GW", name: "Guinea-Bissau", dial: "245", lengths: [7] },
  { iso: "GN", name: "Guinea", dial: "224", lengths: [8, 9] },
  { iso: "SL", name: "Sierra Leone", dial: "232", lengths: [8] },
  { iso: "LR", name: "Liberia", dial: "231", lengths: [7, 8] },
  { iso: "TG", name: "Togo", dial: "228", lengths: [8] },
  { iso: "BJ", name: "Benin", dial: "229", lengths: [8] },
  { iso: "GA", name: "Gabon", dial: "241", lengths: [8] },
  { iso: "GQ", name: "Equatorial Guinea", dial: "240", lengths: [9] },
  { iso: "CF", name: "Central African Rep.", dial: "236", lengths: [8] },
  { iso: "BI", name: "Burundi", dial: "257", lengths: [8] },
  { iso: "ER", name: "Eritrea", dial: "291", lengths: [7] },
  { iso: "SS", name: "South Sudan", dial: "211", lengths: [9] },
  { iso: "MW", name: "Malawi", dial: "265", lengths: [9] },
  { iso: "LS", name: "Lesotho", dial: "266", lengths: [8] },
  { iso: "SZ", name: "Eswatini", dial: "268", lengths: [8] },
  { iso: "KM", name: "Comoros", dial: "269", lengths: [7] },
  { iso: "SC", name: "Seychelles", dial: "248", lengths: [7] },
  { iso: "CV", name: "Cape Verde", dial: "238", lengths: [7] },
  { iso: "ST", name: "Sao Tome & Principe", dial: "239", lengths: [7] },
  { iso: "VE", name: "Venezuela", dial: "58", lengths: [10] },
  { iso: "EC", name: "Ecuador", dial: "593", lengths: [9] },
  { iso: "BO", name: "Bolivia", dial: "591", lengths: [8] },
  { iso: "PY", name: "Paraguay", dial: "595", lengths: [9] },
  { iso: "UY", name: "Uruguay", dial: "598", lengths: [8] },
  { iso: "GY", name: "Guyana", dial: "592", lengths: [7] },
  { iso: "SR", name: "Suriname", dial: "597", lengths: [6, 7] },
  { iso: "GT", name: "Guatemala", dial: "502", lengths: [8] },
  { iso: "BZ", name: "Belize", dial: "501", lengths: [7] },
  { iso: "HN", name: "Honduras", dial: "504", lengths: [8] },
  { iso: "SV", name: "El Salvador", dial: "503", lengths: [8] },
  { iso: "NI", name: "Nicaragua", dial: "505", lengths: [8] },
  { iso: "CR", name: "Costa Rica", dial: "506", lengths: [8] },
  { iso: "PA", name: "Panama", dial: "507", lengths: [7, 8] },
  { iso: "CU", name: "Cuba", dial: "53", lengths: [8] },
  { iso: "DO", name: "Dominican Republic", dial: "1", lengths: [10] },
  { iso: "JM", name: "Jamaica", dial: "1", lengths: [10] },
  { iso: "TT", name: "Trinidad & Tobago", dial: "1", lengths: [10] },
  { iso: "BB", name: "Barbados", dial: "1", lengths: [10] },
  { iso: "BS", name: "Bahamas", dial: "1", lengths: [10] },
  { iso: "HT", name: "Haiti", dial: "509", lengths: [8] },
  { iso: "PR", name: "Puerto Rico", dial: "1", lengths: [10] },
  { iso: "ZZ", name: "Other", dial: "", lengths: RANGE_7_15 },
];

export const DEFAULT_COUNTRY_ISO = "IN";

export function getCountry(iso: string): Country {
  return COUNTRIES.find((c) => c.iso === iso) ?? COUNTRIES[0];
}

/** Validate national digits against a country's rules. Returns error or null. */
export function validateNationalNumber(
  iso: string,
  digits: string
): string | null {
  const c = getCountry(iso);
  if (!/^\d+$/.test(digits)) return "Please enter digits only.";
  if (!c.lengths.includes(digits.length)) {
    if (c.iso === "IN") {
      return "Indian mobile numbers are 10 digits starting 6–9.";
    }
    return c.lengths.length === 1
      ? `Numbers in ${c.name} must have exactly ${c.lengths[0]} digits.`
      : `Numbers in ${c.name} must have one of these lengths: ${c.lengths.join(", ")}.`;
  }
  if (c.mobileStart && !c.mobileStart.test(digits)) {
    return "Indian mobile numbers start with 6, 7, 8 or 9.";
  }
  return null;
}
