/**
 * Country to currency mapping utility
 * Maps ISO country codes to their respective currency symbols
 */

export interface CountryData {
  countryCode: string;
  currencySymbol: string;
  currencyCode: string;
}

// Comprehensive country to currency mapping
export const COUNTRY_CURRENCY_MAP: Record<string, CountryData> = {
  // Major currencies
  us: { countryCode: "1", currencySymbol: "$", currencyCode: "USD" },
  in: { countryCode: "91", currencySymbol: "₹", currencyCode: "INR" },
  gb: { countryCode: "44", currencySymbol: "£", currencyCode: "GBP" },
  eu: { countryCode: "33", currencySymbol: "€", currencyCode: "EUR" }, // France as EU representative
  de: { countryCode: "49", currencySymbol: "€", currencyCode: "EUR" },
  fr: { countryCode: "33", currencySymbol: "€", currencyCode: "EUR" },
  it: { countryCode: "39", currencySymbol: "€", currencyCode: "EUR" },
  es: { countryCode: "34", currencySymbol: "€", currencyCode: "EUR" },
  ca: { countryCode: "1", currencySymbol: "C$", currencyCode: "CAD" },
  au: { countryCode: "61", currencySymbol: "A$", currencyCode: "AUD" },
  jp: { countryCode: "81", currencySymbol: "¥", currencyCode: "JPY" },
  cn: { countryCode: "86", currencySymbol: "¥", currencyCode: "CNY" },
  kr: { countryCode: "82", currencySymbol: "₩", currencyCode: "KRW" },

  // Asian countries
  sg: { countryCode: "65", currencySymbol: "S$", currencyCode: "SGD" },
  hk: { countryCode: "852", currencySymbol: "HK$", currencyCode: "HKD" },
  my: { countryCode: "60", currencySymbol: "RM", currencyCode: "MYR" },
  th: { countryCode: "66", currencySymbol: "฿", currencyCode: "THB" },
  id: { countryCode: "62", currencySymbol: "Rp", currencyCode: "IDR" },
  ph: { countryCode: "63", currencySymbol: "₱", currencyCode: "PHP" },
  vn: { countryCode: "84", currencySymbol: "₫", currencyCode: "VND" },
  bd: { countryCode: "880", currencySymbol: "৳", currencyCode: "BDT" },
  lk: { countryCode: "94", currencySymbol: "Rs", currencyCode: "LKR" },
  pk: { countryCode: "92", currencySymbol: "Rs", currencyCode: "PKR" },

  // Middle East
  ae: { countryCode: "971", currencySymbol: "د.إ", currencyCode: "AED" },
  sa: { countryCode: "966", currencySymbol: "﷼", currencyCode: "SAR" },
  qa: { countryCode: "974", currencySymbol: "﷼", currencyCode: "QAR" },
  kw: { countryCode: "965", currencySymbol: "د.ك", currencyCode: "KWD" },

  // Africa
  za: { countryCode: "27", currencySymbol: "R", currencyCode: "ZAR" },
  ng: { countryCode: "234", currencySymbol: "₦", currencyCode: "NGN" },
  eg: { countryCode: "20", currencySymbol: "£", currencyCode: "EGP" },

  // South America
  br: { countryCode: "55", currencySymbol: "R$", currencyCode: "BRL" },
  ar: { countryCode: "54", currencySymbol: "$", currencyCode: "ARS" },
  mx: { countryCode: "52", currencySymbol: "$", currencyCode: "MXN" },
  cl: { countryCode: "56", currencySymbol: "$", currencyCode: "CLP" },

  // Other European countries
  ch: { countryCode: "41", currencySymbol: "CHF", currencyCode: "CHF" },
  se: { countryCode: "46", currencySymbol: "kr", currencyCode: "SEK" },
  no: { countryCode: "47", currencySymbol: "kr", currencyCode: "NOK" },
  dk: { countryCode: "45", currencySymbol: "kr", currencyCode: "DKK" },
  pl: { countryCode: "48", currencySymbol: "zł", currencyCode: "PLN" },
  ru: { countryCode: "7", currencySymbol: "₽", currencyCode: "RUB" },

  // Others
  nz: { countryCode: "64", currencySymbol: "NZ$", currencyCode: "NZD" },
  il: { countryCode: "972", currencySymbol: "₪", currencyCode: "ILS" },
  tr: { countryCode: "90", currencySymbol: "₺", currencyCode: "TRY" },

  // Africa (additional)
  gh: { countryCode: "233", currencySymbol: "₵", currencyCode: "GHS" },
  ke: { countryCode: "254", currencySymbol: "KSh", currencyCode: "KES" },
  tz: { countryCode: "255", currencySymbol: "TSh", currencyCode: "TZS" },
  ug: { countryCode: "256", currencySymbol: "USh", currencyCode: "UGX" },
  dz: { countryCode: "213", currencySymbol: "دج", currencyCode: "DZD" },
  ma: { countryCode: "212", currencySymbol: "د.م.", currencyCode: "MAD" },

  // Europe (additional)
  nl: { countryCode: "31", currencySymbol: "€", currencyCode: "EUR" },
  be: { countryCode: "32", currencySymbol: "€", currencyCode: "EUR" },
  at: { countryCode: "43", currencySymbol: "€", currencyCode: "EUR" },
  ie: { countryCode: "353", currencySymbol: "€", currencyCode: "EUR" },
  pt: { countryCode: "351", currencySymbol: "€", currencyCode: "EUR" },
  cz: { countryCode: "420", currencySymbol: "Kč", currencyCode: "CZK" },
  hu: { countryCode: "36", currencySymbol: "Ft", currencyCode: "HUF" },
  ro: { countryCode: "40", currencySymbol: "lei", currencyCode: "RON" },

  // Asia-Pacific (additional)
  np: { countryCode: "977", currencySymbol: "Rs", currencyCode: "NPR" },
  mm: { countryCode: "95", currencySymbol: "Ks", currencyCode: "MMK" },
  kh: { countryCode: "855", currencySymbol: "៛", currencyCode: "KHR" },
  la: { countryCode: "856", currencySymbol: "₭", currencyCode: "LAK" },
  mn: { countryCode: "976", currencySymbol: "₮", currencyCode: "MNT" },

  // Americas (additional)
  co: { countryCode: "57", currencySymbol: "$", currencyCode: "COP" },
  pe: { countryCode: "51", currencySymbol: "S/", currencyCode: "PEN" },
  uy: { countryCode: "598", currencySymbol: "$U", currencyCode: "UYU" },
  ve: { countryCode: "58", currencySymbol: "Bs.", currencyCode: "VES" },
};

/**
 * Get currency data for a country code
 * @param countryCode - ISO country code (e.g., 'in', 'us', 'gb')
 * @returns CountryData object with currency information
 */
export const getCurrencyByCountry = (countryCode: string): CountryData => {
  const normalizedCode = countryCode.toLowerCase();
  return (
    COUNTRY_CURRENCY_MAP[normalizedCode] || {
      countryCode: "91",
      currencySymbol: "₹",
      currencyCode: "INR",
    }
  );
};

/**
 * Get country code number from ISO country code
 * @param countryCode - ISO country code (e.g., 'in', 'us', 'gb')
 * @returns Country calling code as number
 */
export const getCountryCodeNumber = (countryCode: string): number => {
  const countryData = getCurrencyByCountry(countryCode);
  return parseInt(countryData.countryCode, 10);
};

/**
 * Get currency symbol from ISO country code
 * @param countryCode - ISO country code (e.g., 'in', 'us', 'gb')
 * @returns Currency symbol as string
 */
export const getCurrencySymbol = (countryCode: string): string => {
  const countryData = getCurrencyByCountry(countryCode);
  return countryData.currencySymbol;
};

/**
 * Validate if a country code exists in our mapping
 * @param countryCode - ISO country code to validate
 * @returns boolean indicating if country code is supported
 */
export const isValidCountryCode = (countryCode: string): boolean => {
  return countryCode.toLowerCase() in COUNTRY_CURRENCY_MAP;
};
