<?php

declare (strict_types=1);
namespace Kazcode\WpStorage\Vendor\GuzzleHttp;

use Kazcode\WpStorage\Vendor\GuzzleHttp\Exception\InvalidArgumentException;
use Kazcode\WpStorage\Vendor\Psr\Http\Message\UriInterface;
/**
 * @internal
 */
final class Idn
{
    private function __construct()
    {
    }
    /**
     * @param mixed $value
     */
    public static function normalizeConversionOption($value): ?int
    {
        if ($value === null || $value === \false) {
            return null;
        }
        if ($value === \true) {
            return \IDNA_DEFAULT;
        }
        if (\is_int($value)) {
            return $value;
        }
        throw new InvalidArgumentException('idn_conversion must be true, false, null, or an integer IDNA_* bitmask');
    }
    /**
     * @throws InvalidArgumentException
     */
    public static function convertUri(UriInterface $uri, int $options = 0): UriInterface
    {
        if ($uri->getHost()) {
            $asciiHost = self::idnToAsci($uri->getHost(), $options, $info);
            if ($asciiHost === \false) {
                $errorBitSet = $info['errors'] ?? 0;
                $errorConstants = array_filter(array_keys(get_defined_constants()), static function (string $name): bool {
                    return substr($name, 0, 11) === 'IDNA_ERROR_';
                });
                $errors = [];
                foreach ($errorConstants as $errorConstant) {
                    if ($errorBitSet & constant($errorConstant)) {
                        $errors[] = $errorConstant;
                    }
                }
                $errorMessage = 'IDN conversion failed';
                if ($errors) {
                    $errorMessage .= ' (errors: ' . implode(', ', $errors) . ')';
                }
                throw new InvalidArgumentException($errorMessage);
            }
            if ($uri->getHost() !== $asciiHost) {
                // Replace URI only if the ASCII version is different
                $uri = $uri->withHost($asciiHost);
            }
        }
        return $uri;
    }
    /**
     * @return string|false
     */
    private static function idnToAsci(string $domain, int $options, ?array &$info = [])
    {
        if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) {
            return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info);
        }
        throw new \Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old');
    }
}
