<?php

namespace brain\utility;

use ReallySimpleJWT\Token;
use ReallySimpleJWT\Exception\BuildException;
use Mni\FrontYAML\Parser;

class StringTools
{
    public static function createUUID()
    {
        if (function_exists('com_create_guid') === true) {
            return trim(com_create_guid(), '{}');
        }

        return sprintf(
            '%04X%04X-%04X-%04X-%04X-%04X%04X%04X',
            mt_rand(0, 65535),
            mt_rand(0, 65535),
            mt_rand(0, 65535),
            mt_rand(16384, 20479),
            mt_rand(32768, 49151),
            mt_rand(0, 65535),
            mt_rand(0, 65535),
            mt_rand(0, 65535)
        );
    }

    public static function sanitizeContent($entry)
    {
        $parser    = new Parser();
        $rendered  = $parser->parse($entry);
        $sanitizer = HtmlSanitizer\Sanitizer::create([
            'extensions' => ['basic', 'image', 'list', 'code'],
            'tags'       => [
                'img' => [
                    'allowed_attributes' => ['src', 'alt', 'title', 'class'],
                    'allowed_hosts'      => null,
                ],
            ],
        ]);

        $preclean = $sanitizer->sanitize($rendered->getContent());

        $cleaned = strip_tags($rendered->getContent(), [
            'a',
            'br',
            'p',
            'strong',
            'br',
            'img',
            'iframe',
            'ul',
            'li',
            'i',
            'h1',
            'h2',
            'h3',
            'pre',
            'code',
        ]);

        return $cleaned;
    }

    public static function safeString($string)
    {
        return strtolower(
            trim(
                preg_replace(
                    '~[^0-9a-z]+~i',
                    '_',
                    html_entity_decode(
                        preg_replace(
                            '~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i',
                            '$1',
                            htmlentities($string, ENT_QUOTES, 'UTF-8')
                        ),
                        ENT_QUOTES,
                        'UTF-8'
                    )
                ),
                '-'
            )
        );
    }

    public static function randomString(int $length)
    {
        $alphanum        = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        $special         = '*&!@%^#$';
        $alphabet        = $alphanum . $special;
        $random          = openssl_random_pseudo_bytes($length);
        $alphabet_length = strlen($alphabet);
        $string          = '';
        for ($i = 0; $i < $length; ++$i) {
            $string .= $alphabet[ord($random[$i]) % $alphabet_length];
        }

        //secret needs to be a valid token
        if ($length == 12) {
            try {
                $secret = Token::create(12, $string, time() + 3600, 'localhost');
                return $string;
            } catch (BuildException $e) {
                //bad secret, so try agiain
                //echo "BAD STRING";
                return self::randomString(12);
            }

            if (Token::validate($key, $string)) {
                return $string;
            } else {
                return self::randomString(12);
            }
        }
    }

    private static function checkSpecial($string)
    {
        $specials = ['*', '&', '!', '@', '%', '^', '#', '$'];
        $valid    = false;
        foreach ($specials as $item) {
            if (strpos($string, $item)) {
                return $valid = true;
            }
        }
        return $valid;
    }
}