<?php

namespace App\Packages\Phone\Service;

use App\Packages\User\Manager\UserEntityManager;
use App\Packages\User\Models\User;
use libphonenumber\CountryCodeToRegionCodeMap;
use libphonenumber\NumberParseException;
use libphonenumber\PhoneNumber;
use libphonenumber\PhoneNumberUtil;

/**
 * Class SmsService
 * @package App\Packages\User\Transformer
 */
class PhoneParseService
{
    /** @var PhoneNumberUtil */
    private $phoneUtil;

    public function __construct()
    {
        $this->phoneUtil = PhoneNumberUtil::getInstance();
    }

    /**
     * @param string $number
     *
     * @return string mixed
     */
    public static function removePlusSign($number)
    {
        return preg_replace('/\s+/', '', $number);
    }

    /**
     * @param string $number
     *
     * @return string mixed
     */
    public static function removeZeros($number)
    {
        return preg_replace('/^00/', '+', $number);
    }

    /**
     * @param PhoneNumber $phoneNumber
     *
     * @return bool
     */
    public function isValidNumber(PhoneNumber $phoneNumber)
    {
        return $this->phoneUtil->isValidNumber($phoneNumber)
            && $this->phoneUtil->isPossibleNumber($phoneNumber);
    }

    /**
     * @param $numberString
     * @param $defaultCode
     *
     * @return NumberParseException|PhoneNumber
     */
    public function parseNumber($numberString, $defaultCode)
    {
        $numberString = static::removePlusSign($numberString);
        $numberString = static::removeZeros($numberString);

        try {
            $result = $this->phoneUtil->parse($numberString);
        } catch (NumberParseException $e) {
            try {
                $defaultCodeRegion = CountryCodeToRegionCodeMap::$countryCodeToRegionCodeMap[$defaultCode];
                $result = $this->phoneUtil->parse($numberString, $defaultCodeRegion[0]);
            } catch (NumberParseException $e) {
                $result = $e;
            }
        }

        return $result;
    }
}