<?php

declare (strict_types=1);
namespace SlimStat\Dependencies\BrowscapPHP\Helper;

use UnexpectedValueException;
use function preg_match;
use function preg_quote;
use function preg_replace;
use function sprintf;
use function str_replace;
/**
 * class to help quoting strings for using a regex
 */
final class Quoter implements QuoterInterface
{
    /**
     * Converts browscap match patterns into preg match patterns.
     *
     * @throws void
     */
    public function pregQuote(string $useragent, string $delimiter = '/'): string
    {
        $pattern = preg_quote($useragent, $delimiter);
        // the \\x replacement is a fix for "Der gro\xdfe BilderSauger 2.00u" user agent match
        return str_replace(['\*', '\?', '\x'], ['.*', '.', '\\\\x'], $pattern);
    }
    /**
     * Reverts the quoting of a pattern.
     *
     * @throws UnexpectedValueException
     */
    public function pregUnQuote(string $pattern): string
    {
        // Fast check, because most parent pattern like 'DefaultProperties' don't need a replacement
        if (!preg_match('/[^a-z\s]/i', $pattern)) {
            return $pattern;
        }
        $origPattern = $pattern;
        // Undo the \\x replacement, that is a fix for "Der gro\xdfe BilderSauger 2.00u" user agent match
        // @source https://github.com/browscap/browscap-php
        $pattern = preg_replace(['/(?<!\\\\)\.\*/', '/(?<!\\\\)\./', '/(?<!\\\\)\\\\x/'], ['\*', '\?', '\x'], $pattern);
        if ($pattern === null) {
            throw new UnexpectedValueException(sprintf('an error occured while handling pattern %s', $origPattern));
        }
        // Undo preg_quote
        return str_replace(['\\\\', '\+', '\*', '\?', '\[', '\^', '\]', '\$', '\(', '\)', '\{', '\}', '\=', '\!', '\<', '\>', '\|', '\:', '\-', '\.', '\/', '\#'], ['\\', '+', '*', '?', '[', '^', ']', '$', '(', ')', '{', '}', '=', '!', '<', '>', '|', ':', '-', '.', '/', '#'], $pattern);
    }
}