<?PHP
/**
 * Provides static functions for simple caching.
 *
 * @author Joshua Ramon Enslin <joshua@museum-digital.de>
 */
declare(strict_types = 1);

/**
 * Provides caching functions.
 */
final class MD_STD_CACHE {

    /** @var string */
    public static string $redis_host = '127.0.0.1';
    /** @var integer */
    public static int $redis_port = 6379;

    /**
     * Shutdown function for caching contents of output buffer.
     *
     * @param string  $redisKey Key to cache by in redis.
     * @param integer $expiry   Expiration time in seconds.
     *
     * @return void
     */
    public static function shutdown_cache_through_redis(string $redisKey, int $expiry = 3600):void {

        $outputT = trim(MD_STD::minimizeHTMLString(MD_STD::ob_get_clean()));
        echo $outputT;

        $redis = new Redis();
        $redis->connect(self::$redis_host, self::$redis_port, 1, NULL, 0, 0, ['auth' => [MD_CONF::$redis_pw]]);
        $redis->set($redisKey, $outputT);
        $redis->expire($redisKey, $expiry);
        $redis->close();

    }

    /**
     * Caches and serves a page through redis. Should be called at the start
     * of the script generating a page.
     *
     * @param string  $redisKey Key to cache by in redis.
     * @param integer $expiry   Expiration time in seconds.
     *
     * @return string
     */
    public static function serve_page_through_redis_cache(string $redisKey, int $expiry = 3600):string {

        if (PHP_SAPI === 'cli') return '';

        $redis = new Redis();
        $redis->connect(self::$redis_host, self::$redis_port, 1, NULL, 0, 0, ['auth' => [MD_CONF::$redis_pw]]);
        if ($redis->ping() !== false) {

            ob_start();

            if (($redisResult = $redis->get($redisKey))) {

                if (strlen($redisResult) > 3) {
                    $redis->close();
                    return $redisResult;
                }
                else {
                    register_shutdown_function(function(string $redisKey, int $expiry = 3600) :void {
                        self::shutdown_cache_through_redis($redisKey, $expiry);
                    }, $redisKey);
                }

            }
            else {

                register_shutdown_function(function(string $redisKey, int $expiry = 3600) :void {
                    self::shutdown_cache_through_redis($redisKey, $expiry);
                }, $redisKey);

            }

        }
        $redis->close();

        return '';

    }
}