export type DialCountry = {
  iso: string;
  name: string;
  dial: string;
  flag: string;
};

/** Curated dial list — East Africa first, then common markets. */
export const DIAL_COUNTRIES: DialCountry[] = [
  { iso: 'TZ', name: 'Tanzania', dial: '255', flag: '🇹🇿' },
  { iso: 'KE', name: 'Kenya', dial: '254', flag: '🇰🇪' },
  { iso: 'UG', name: 'Uganda', dial: '256', flag: '🇺🇬' },
  { iso: 'RW', name: 'Rwanda', dial: '250', flag: '🇷🇼' },
  { iso: 'BI', name: 'Burundi', dial: '257', flag: '🇧🇮' },
  { iso: 'CD', name: 'DR Congo', dial: '243', flag: '🇨🇩' },
  { iso: 'ZM', name: 'Zambia', dial: '260', flag: '🇿🇲' },
  { iso: 'MW', name: 'Malawi', dial: '265', flag: '🇲🇼' },
  { iso: 'MZ', name: 'Mozambique', dial: '258', flag: '🇲🇿' },
  { iso: 'ZA', name: 'South Africa', dial: '27', flag: '🇿🇦' },
  { iso: 'NG', name: 'Nigeria', dial: '234', flag: '🇳🇬' },
  { iso: 'GH', name: 'Ghana', dial: '233', flag: '🇬🇭' },
  { iso: 'ET', name: 'Ethiopia', dial: '251', flag: '🇪🇹' },
  { iso: 'SO', name: 'Somalia', dial: '252', flag: '🇸🇴' },
  { iso: 'SS', name: 'South Sudan', dial: '211', flag: '🇸🇸' },
  { iso: 'SD', name: 'Sudan', dial: '249', flag: '🇸🇩' },
  { iso: 'EG', name: 'Egypt', dial: '20', flag: '🇪🇬' },
  { iso: 'MA', name: 'Morocco', dial: '212', flag: '🇲🇦' },
  { iso: 'AE', name: 'United Arab Emirates', dial: '971', flag: '🇦🇪' },
  { iso: 'SA', name: 'Saudi Arabia', dial: '966', flag: '🇸🇦' },
  { iso: 'IN', name: 'India', dial: '91', flag: '🇮🇳' },
  { iso: 'CN', name: 'China', dial: '86', flag: '🇨🇳' },
  { iso: 'TR', name: 'Turkey', dial: '90', flag: '🇹🇷' },
  { iso: 'GB', name: 'United Kingdom', dial: '44', flag: '🇬🇧' },
  { iso: 'US', name: 'United States', dial: '1', flag: '🇺🇸' },
  { iso: 'CA', name: 'Canada', dial: '1', flag: '🇨🇦' },
  { iso: 'DE', name: 'Germany', dial: '49', flag: '🇩🇪' },
  { iso: 'FR', name: 'France', dial: '33', flag: '🇫🇷' },
  { iso: 'NL', name: 'Netherlands', dial: '31', flag: '🇳🇱' },
  { iso: 'IT', name: 'Italy', dial: '39', flag: '🇮🇹' },
  { iso: 'ES', name: 'Spain', dial: '34', flag: '🇪🇸' },
  { iso: 'PT', name: 'Portugal', dial: '351', flag: '🇵🇹' },
  { iso: 'BR', name: 'Brazil', dial: '55', flag: '🇧🇷' },
  { iso: 'AU', name: 'Australia', dial: '61', flag: '🇦🇺' },
];

export const DEFAULT_DIAL_ISO = 'TZ';

export function digitsOnly(value: string) {
  return value.replace(/\D/g, '');
}

export function findCountryByIso(iso: string) {
  return DIAL_COUNTRIES.find(c => c.iso === iso) ?? DIAL_COUNTRIES[0]!;
}

/** Longest dial-code match first so +255 wins over +2 / +25. */
export function detectCountryFromDigits(digits: string): DialCountry {
  const sorted = [...DIAL_COUNTRIES].sort((a, b) => b.dial.length - a.dial.length);
  for (const country of sorted) {
    if (digits.startsWith(country.dial)) return country;
  }
  return findCountryByIso(DEFAULT_DIAL_ISO);
}

export function parsePhoneValue(raw: string | null | undefined, fallbackIso = DEFAULT_DIAL_ISO) {
  const trimmed = (raw ?? '').trim();
  if (!trimmed) {
    return { country: findCountryByIso(fallbackIso), national: '' };
  }
  const digits = digitsOnly(trimmed);
  if (trimmed.startsWith('+') || digits.length > 9) {
    const country = detectCountryFromDigits(digits);
    return {
      country,
      national: digits.slice(country.dial.length).replace(/^0+/, ''),
    };
  }
  return {
    country: findCountryByIso(fallbackIso),
    national: digits.replace(/^0+/, ''),
  };
}

/** National digits → E.164 (+2557…). Empty national → empty string. */
export function toE164(iso: string, national: string) {
  const country = findCountryByIso(iso);
  const local = digitsOnly(national).replace(/^0+/, '');
  if (!local) return '';
  return `+${country.dial}${local}`;
}

export function formatNationalDisplay(national: string) {
  const digits = digitsOnly(national).replace(/^0+/, '');
  if (digits.length <= 3) return digits;
  if (digits.length <= 6) return `${digits.slice(0, 3)} ${digits.slice(3)}`;
  if (digits.length <= 9) return `${digits.slice(0, 3)} ${digits.slice(3, 6)} ${digits.slice(6)}`;
  return `${digits.slice(0, 3)} ${digits.slice(3, 6)} ${digits.slice(6, 9)} ${digits.slice(9, 12)}`.trim();
}
