<?php
use ReallySimpleJWT\Token;
use ReallySimpleJWT\Exception\BuildException;
use Mni\FrontYAML\Parser;
//include "brain/data/Auth.inc.php";

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