// Copyright 2014-2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import {
  instance as libphonenumber,
  PhoneNumberFormat,
} from './libphonenumberInstance';

const FALLBACK_REGION_CODE = 'ZZ';

export function getRegionCodeForNumber(number: string): string {
  try {
    const parsedNumber = libphonenumber.parse(number);
    return (
      libphonenumber.getRegionCodeForNumber(parsedNumber) ||
      FALLBACK_REGION_CODE
    );
  } catch (e) {
    return FALLBACK_REGION_CODE;
  }
}

export function parseNumber(
  number: string,
  defaultRegionCode?: string
):
  | { isValidNumber: false; error: unknown }
  | {
      isValidNumber: true;
      regionCode: undefined | string;
      countryCode: undefined | string;
      e164: string;
    } {
  try {
    const parsedNumber = libphonenumber.parse(number, defaultRegionCode);

    const isValidNumber = libphonenumber.isValidNumber(parsedNumber);
    if (!isValidNumber) {
      return { error: new Error('Invalid phone number'), isValidNumber: false };
    }

    return {
      isValidNumber: true,
      regionCode: libphonenumber.getRegionCodeForNumber(parsedNumber),
      countryCode: parsedNumber.getCountryCode()?.toString(),
      e164: libphonenumber.format(parsedNumber, PhoneNumberFormat.E164),
    };
  } catch (error) {
    return { error, isValidNumber: false };
  }
}