<?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;
    }
}