<?php

declare(strict_types=1);

namespace App\Core;

use Nette\Utils\Image;
use Nette\Utils\ImageType;
use DateInterval;

/**
 * Třída plná užitečných funkcí.
 */
class Funkce
{
    /**
     * Rozšifruje data, která jsme předtím zašifrovali pomocí
     * funkce QRURL ve vb.net
     */
    public static function decrypt($data)
    {
        $password = '3sc3RLrpd17tvl';
        $password = substr(hash('sha256', $password, true), 0, 32);
        $iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
        $decrypted = openssl_decrypt(base64_decode($data), 'aes-256-cbc', $password, OPENSSL_RAW_DATA, $iv);
        return $decrypted;
    }

    /**
     * Šifrovací funkce. Měla by odpovídat .NETovské verzi. Funfuje s funkcí decrypt().
     */
    public static function encrypt($data)
    {
        $password = '3sc3RLrpd17tvl';
        $password = substr(hash('sha256', $password, true), 0, 32);
        $iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
        return base64_encode(openssl_encrypt($data, 'aes-256-cbc', $password, OPENSSL_RAW_DATA, $iv));
    }

    /**
     * Používáme pro zašifrování cookie s passwordem.
     * Raději jiná funkce než pro šifrování / dešifrování údajů předaných z VB.NET
     * Vzato odtud: https://www.w3docs.com/snippets/php/how-to-encrypt-and-decrypt-a-string-in-php.html
     * @param mixed $password
     * @return bool|string
     */
    public static function encrypt_password($password)
    {
        $ciphering = "AES-128-CTR";
        $iv_length = openssl_cipher_iv_length($ciphering);
        $options = 0;
        $encryption_iv = '1233567881014121';
        $encryption_key = "sfb16196a19ibniv";
        return openssl_encrypt($password, $ciphering, $encryption_key, $options, $encryption_iv);
    }

    /**
     * Používáme pro zašifrování cookie s passwordem.
     * Raději jiná funkce než pro šifrování / dešifrování údajů předaných z VB.NET
     * Vzato odtud: https://www.w3docs.com/snippets/php/how-to-encrypt-and-decrypt-a-string-in-php.html
     * @param mixed $encrypted
     * @return bool|string
     */
    public static function decrypt_password($encrypted)
    {
        $ciphering = "AES-128-CTR";
        $options = 0;
        $decryption_iv = '1233567881014121';
        $decryption_key = "sfb16196a19ibniv";
        return openssl_decrypt($encrypted, $ciphering, $decryption_key, $options, $decryption_iv);
    }

    /**
     * Slouží pro testování, zda se připojujeme pouze do cloudových serverů.
     * V podstatě opis funkce IsCloudIP z VB.NET.
     * Pozor, v proměnné $server může být např "data.xzajic.cz,2000"
     * Tedy i port.
     * @param string $server
     * @return bool
     */
    public static function is_cloud_ip(string $server): bool
    {
        $cloudoveservery = array(
            "data.xzajic.cz",
            "boromir.xzajic.cz",
            "faramir.xzajic.cz",
            "galadriel.xzajic.cz",
            "sql.xzajic.cz",
            "sql2.xzajic.cz",
            "base.xzajic.cz",
            "merkur.xzajic.cz",
            "mars.xzajic.cz",
            "data.powercare.cz",
            "kadan.pecovatelska.cz",
            "novybor.pecovatelska.cz",
            "decin.pecovatelska.cz",
            "lomnice.pecovatelska.cz",
            "zbraslav.pecovatelska.cz",
            "semily.pecovatelska.cz",
            "jesenik.pecovatelska.cz",
            "ledax.pecovatelska.cz",
            "venuse.xzajic.cz",
            "136.243.90.39", //136.243.90.39 Venuše
            "173.212.216.246", //173.212.216.246 Merkur
            "173.249.52.108", //173.249.52.108 Base
            "195.201.86.17", //195.201.86.17 Mars
            "kmetix.cz" //debug
        );
        $server = strtolower($server);
        foreach ($cloudoveservery as $cloudovyserver) {
            if (str_contains($server, $cloudovyserver))
                return true;
        }
        return false;

    }

    /**
     * Občas uživatel zadá staré jméno serveru, tak tato funkce nahradí staré jméno novým.
     * @param mixed $server
     * @return void
     */
    public static function GetServerAlias(&$server)
    {
        //osekat mezery:
        //'data.xzajic.cz, 1433' vs. 'data.xzajic.cz,1433'
        $server = strtolower(trim(str_replace(' ', '', $server)));

        $aliasy = array(
            //"base.xzajic.cz" => "base.xzajic.cz",
            "data.xzajic.cz" => "base.xzajic.cz",
            "faramir.xzajic.cz" => "base.xzajic.cz",
            "sql2.xzajic.cz" => "base.xzajic.cz",
            "data.powercare.cz" => "base.xzajic.cz",
            //"merkur.xzajic.cz" => "merkur.xzajic.cz",
            "bilbo.xzajic.cz" => "merkur.xzajic.cz",
            "boromir.xzajic.cz" => "merkur.xzajic.cz",
            "galadriel.xzajic.cz" => "merkur.xzajic.cz",
            "haldir.xzajic.cz" => "merkur.xzajic.cz",
            "sql.xzajic.cz" => "merkur.xzajic.cz",
            "kadan.pecovatelska.cz" => "merkur.xzajic.cz",
            "novybor.pecovatelska.cz" => "merkur.xzajic.cz",
            "decin.pecovatelska.cz" => "merkur.xzajic.cz",
            "lomnice.pecovatelska.cz" => "merkur.xzajic.cz",
            "zbraslav.pecovatelska.cz" => "merkur.xzajic.cz",
            "semily.pecovatelska.cz" => "merkur.xzajic.cz",
            "jesenik.pecovatelska.cz" => "merkur.xzajic.cz",
            "ledax.pecovatelska.cz" => "merkur.xzajic.cz",
            //"mars.xzajic.cz" => "mars.xzajic.cz",
        );

        foreach ($aliasy as $key => $value) {
            if (str_contains($server, $key)) { //existuje alias v serveru?
                $server = str_replace($key, $value, $server); //nahraď pravým jménem serveru
                break;
            }
        }
    }

    public static function CreateBarevnyKolecko(int $barva)
    {
        // barvičky do int, toto php neumí (asi):
        $barvaHEX = substr(dechex($barva), -6);
        $red = hexdec(substr($barvaHEX, 0, 2));
        $green = hexdec(substr($barvaHEX, 2, 2));
        $blue = hexdec(substr($barvaHEX, 4, 2));

        // create a blank image
        $image = imagecreatetruecolor(17, 17);

        imagealphablending($image, true);
        imagesavealpha($image, true);

        // fill the background color
        //$bg = imagecolorallocate($image, 0, 0, 0 );
        $white = imagecolorallocatealpha($image, 255, 255, 255, 127); //plná průhlednost!!!
        imagefill($image, 0, 0, $white);

        // choose a color for the ellipse
        $col_ellipse = imagecolorallocatealpha($image, $red, $green, $blue, 0);
        // draw the white ellipse
        imagefilledellipse($image, 8, 8, 16, 16, $col_ellipse);

        // output the picture
        ob_start();
        imagepng($image);
        $image_data = ob_get_contents();
        ob_end_clean();

        $image = Image::fromString($image_data);
        $image->send(ImageType::PNG);
    }

    /**
     * Test na svátek nebo so/ne.
     * @param mixed $datum
     * @return bool
     */
    public static function jeSoNeSv(\DateTimeInterface $datum): bool
    {
        // nejdříve test na sobotu nebo neděli:
        if ($datum->format("N") == 6 or $datum->format("N") == 7)
            return true;

        //pak svátky:
        $svatky = array();
        $svatky[] = date_create($datum->format("Y") . "-01-01"); // Nový rok
        // Velký pátek:
        $velkyPatek = date_create(date("m/d/Y", easter_date((int) $datum->format("Y")))); // výchozí den je Velikonoční neděle       
        $velkyPatekInt = DateInterval::createFromDateString("2 days");
        $velkyPatekInt->invert = 1;
        $svatky[] = date_add($velkyPatek, $velkyPatekInt); // Velký pátek = neděle - 2 dny
        // Velikonoční pondělí:
        $velikonocniPondeli = date_create(date("m/d/Y", easter_date((int) $datum->format("Y")))); //výchozí den je Velikonoční neděle 
        $velikonocniPondeliInt = DateInterval::createFromDateString("1 days");
        $svatky[] = date_add($velikonocniPondeli, $velikonocniPondeliInt); // Velikonoční pondělí = neděle + 1 den

        $svatky[] = date_create($datum->format("Y") . "-05-01"); // Svátek práce
        $svatky[] = date_create($datum->format("Y") . "-05-08"); // Den osvobození
        $svatky[] = date_create($datum->format("Y") . "-07-05"); // Den slovanských věrozvěstů Cyrila a Metoděje
        $svatky[] = date_create($datum->format("Y") . "-07-06"); // Den upálení mistra Jana Husa
        $svatky[] = date_create($datum->format("Y") . "-09-28"); // Den české státnosti
        $svatky[] = date_create($datum->format("Y") . "-10-28"); // Den vzniku samostatného československého státu
        $svatky[] = date_create($datum->format("Y") . "-11-17"); // Den boje za svobodu a demokracii
        $svatky[] = date_create($datum->format("Y") . "-12-24"); // Štědrý den
        $svatky[] = date_create($datum->format("Y") . "-12-25"); // 1. svátek vánoční
        $svatky[] = date_create($datum->format("Y") . "-12-26"); // 2. svátek vánoční    

        // test na svátek:
        foreach ($svatky as $svatek) {
            if ($datum->format("Y-m-d") == $svatek->format("Y-m-d"))
                return true;
        }

        return false;
    }
}

