<?php

/**
 * Description of tools
 *
 * @author arson
 */
class Eppe_Tools {

    /**
     * @param string $filename
     * @param bool $lowercase czy zmieniac na małe litery np Jpg=>jpg domyślnie true
     * @return string Rozszerzenie pliku
     */
    static public function getFileExtension($filename, $lowercase = true) {
        $ext_arr = explode('.', $filename);
        $extension = array_pop($ext_arr);
        if ($lowercase) {
            $extension = strtolower($extension);
        }
        return $extension;
    }

    /**
     * @param string $filename nazwa pliku
     * @param string $extension czy funkcja ma zwrócić nazwę pliku razem z rozszerzeniem
     * @return string nazwa pliku bez znaków diakrytycznych i spacji
     */
    static public function getFileSlug($filename, $extension = false) {
        $file_ext = '.' . static::getFileExtension($filename);
        $filename = str_replace($file_ext, '', $filename);

        if ($extension) {
            $slug = Eppe_Slugify::slugify($filename) . $file_ext;
        } else {
            $slug = Eppe_Slugify::slugify($filename);
        }

        return $slug;
    }

    /**
     * @param string $path Ścieżka, która zwiera na końcu nazwę pliku
     * @return string Wyseparowana nazwa pliku z rozszerzeniem
     */
    static public function getFilenameFromPath($path) {
        $filename_arr = explode('/', $path);
        $filename = array_pop($filename_arr);
        return $filename;
    }

    /**
     *
     * 
     * @param string $path Ścieżka do pliku, którego nazwa zostanie zmieniona
     * @return string Ścieżka do pliku, którego nazwa została zmieniona
     * @throws Exception Jeżli plik nie istnieje
     */
    static public function setUniqueName($path) {
        if (!file_exists($path)) {
            throw new Exception('Plik nie istnieje');
        }
        $info = pathinfo($path);
        $newFilename = $info['dirname'] . '/' . md5(microtime() . rand()) . '.' . $info['extension'];
        rename($path, $newFilename);
        return $newFilename;
    }

    /**
     *
     * Dodaje znak wodny do zdjęcia
     * 
     * @param string $imgSrc ścieżka do pliku źródłowego
     * @param string $watermarkSrc ścieżka do pliku ze znakiem wodnym
     * @param init $quality
     * @return boolean
     * @throws Exception 
     */
    static public function addWatermark($imgSrc, $watermarkSrc, $quality = 90) {


        if (!file_exists($watermarkSrc) || !file_exists($imgSrc)) {
            throw new Exception('Plik zródłowy nie istnieje!');
            return false;
        }

        list( $watermarkWidth, $watermarkHeight, $watermarkType ) = getimagesize($watermarkSrc);
        if ($watermarkType != IMAGETYPE_PNG) {
            throw new Exception('Plik ze znakiem wodnym musi być w formacie PNG!');
            return false;
        }


        list( $imgWidth, $imgHeight, $type ) = getimagesize($imgSrc);

        if ($type === NULL) {
            return false;
        }

        switch ($type) {
            case IMAGETYPE_GIF:
                $sourceGd = imagecreatefromgif($imgSrc);
                break;
            case IMAGETYPE_JPEG:
                $sourceGd = imagecreatefromjpeg($imgSrc);
                break;
            case IMAGETYPE_PNG:
                $sourceGd = imagecreatefrompng($imgSrc);
                break;
            default:
                return false;
        }
        $watermarkGd = imagecreatefrompng($watermarkSrc);

        imagecopy(
                $sourceGd, $watermarkGd, $imgWidth / 2 - $watermarkWidth / 2, $imgHeight / 2 - $watermarkHeight / 2, 0, 0, $watermarkWidth, $watermarkHeight
        );

        imagejpeg($sourceGd, $imgSrc);
        imagedestroy($sourceGd);
        imagedestroy($watermarkGd);



        return true;
    }

    /**
     * 	
     * @param string $path
     * @param string $prefix
     * @return string 
     */
    static public function thumbPath($path, $prefix = 'basic_') {
        $info = pathinfo($path);
        return $info['dirname'] . '/' . $prefix . $info['basename'];
    }

    /*
     * @param $string wejściowy string do rozbicia (np. 1d)
     * @return array dwu elementowy, gdzie pierwszy element to liczba (np. 1), a drugi element to string (np. d)
     * Przydatne do obsługi klasy php czasu
     */

    static public function splitDate($string) {
        preg_match_all("/^(\d+)(\w)/", $string, $maches);
        return array($maches[1][0], $maches[2][0]);
    }

    static public function countInterval($string, $format) {
        $interval = new DateInterval('P' . $string);
        return $interval->format('%' . $format);
    }

    /**
     *
     * @param type $string wejsciowy ciąg danych
     * @param type $lenght długość jaką maksymalną może osiągnąć wejściowy fragmen (bez doklejanej koncówki)
     * @param type $toEnd końcówka doklejona jeżeli wejściowy string jest dłuszy niż $lenght  ...
     * @return string 
     */
    static public function excerptString($string, $lenght, $toEnd = ' ...') {
        $excerpt = mb_substr($string, 0, $lenght);
        if (mb_strlen($string) > $lenght) {
            $excerpt = mb_substr($excerpt, 0, mb_strripos($excerpt, " "));
            $excerpt .= $toEnd;
        }
        return $excerpt;
    }

    static public function determinePaginationQueryString($page) {
        if (empty($_SERVER['QUERY_STRING'])) {
            return '?page=' . $page;
        } elseif (FALSE === strpos($_SERVER['QUERY_STRING'], 'page=')) {
            return 'page=' . $page . '&' . $_SERVER['QUERY_STRING'];
        } else {
            return preg_replace('/page=[0-9]+/', 'page=' . $page, $_SERVER['QUERY_STRING']);
        }
    }

    static public function determinePaginationStartingSymbol() {
        $itIsHerePage = (isset($_GET['page'])) ? 1 : 0;
        if (count($_GET) - $itIsHerePage) {
            return '&';
        }
        return '?';
    }

    static public function getScriptUrl() {
        return str_replace($_SERVER['QUERY_STRING'], '', str_replace('?', '', $_SERVER['REQUEST_URI']));
    }

    static public function determinePaginationServerURI() {
        $pos = strpos($_SERVER['REQUEST_URI'], 'page');
        $serverURI = ($pos > 0) ? substr($_SERVER['REQUEST_URI'], 0, $pos - 1) : $_SERVER['REQUEST_URI'];

        return $serverURI;
    }

    static public function stripZipCode($string, $returnZipCode = false) {
        preg_match('/[0-9]{2}-[0-9]{3}/', $string, $matches);
        if ($returnZipCode) {
            return isset($matches[0]) ? $matches[0] : '';
        } else {
            return trim(str_replace(@$matches[0], '', $string));
        }
    }

    static public function serializeElementsByKeyRegex($values, $regex, $serialized_key) {
        $toSerialize = array();
        $returnValues = array();

        foreach ($values as $key => $value) {
            if (preg_match($regex, $key)) {
                $toSerialize[$key] = $value;
            } else {
                $returnValues[$key] = $value;
            }
        }
        $returnValues[$serialized_key] = serialize($toSerialize);

        return $returnValues;
    }

    /**
     * Modyfikuje format daty
     * 
     * @param string $date 
     * @param string $requestedFormat żądany format zgodny z funkcją date()
     * @return string data w żądanym formacie
     */
    static public function getDate($date, $requestedFormat) {
        $dateTime = new DateTime($date);
        return $dateTime->format($requestedFormat);
    }

    /**
     * Usuwa puste elementy z tablicy
     * 
     * @param array $params
     * @return array
     */
    static public function unsetEmptyParams($params) {
        foreach ($params as $key => $param) {
            if (empty($param))
                unset($params[$key]);
        }
        return $params;
    }

    /**
     * Szyfruje zadany tekst przy pomocy podanego klucza
     * @param String $phrase tekst do zaszyfrowania
     * @param String $method 'encode', 'decode'
     * @param String $key klucz szyfrujacy, domyslnie $config->emails->password->key
     * @return String zaszyfrowany tekst
     */
    static public function cipherString($phrase, $method, $key) {
        if ($method == 'encode')
            return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $phrase, MCRYPT_MODE_ECB, mcrypt_create_iv(32, MCRYPT_RAND)));
        else if ($method == 'decode')
            return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($phrase), MCRYPT_MODE_ECB, mcrypt_create_iv(32, MCRYPT_RAND)));
    }

    public static function slownie($kw) {

        $t_a = array('', 'sto', 'dwieście', 'trzysta', 'czterysta', 'pięćset', 'sześćset', 'siedemset', 'osiemset', 'dziewięćset');
        $t_b = array('', 'dziesięć', 'dwadzieścia', 'trzydzieści', 'czterdzieści', 'pięćdziesiąt', 'sześćdziesiąt', 'siedemdziesiąt', 'osiemdziesiąt', 'dziewięćdziesiąt');
        $t_c = array('', 'jeden', 'dwa', 'trzy', 'cztery', 'pięć', 'sześć', 'siedem', 'osiem', 'dziewięć');
        $t_d = array('dziesięć', 'jedenaście', 'dwanaście', 'trzynaście', 'czternaście', 'piętnaście', 'szesnaście', 'siednaście', 'osiemnaście', 'dziewiętnaście');

        $t_kw_15 = array('septyliard', 'septyliardów', 'septyliardy');
        $t_kw_14 = array('septylion', 'septylionów', 'septyliony');
        $t_kw_13 = array('sekstyliard', 'sekstyliardów', 'sekstyliardy');
        $t_kw_12 = array('sekstylion', 'sekstylionów', 'sepstyliony');
        $t_kw_11 = array('kwintyliard', 'kwintyliardów', 'kwintyliardy');
        $t_kw_10 = array('kwintylion', 'kwintylionów', 'kwintyliony');
        $t_kw_9 = array('kwadryliard', 'kwadryliardów', 'kwaryliardy');
        $t_kw_8 = array('kwadrylion', 'kwadrylionów', 'kwadryliony');
        $t_kw_7 = array('tryliard', 'tryliardów', 'tryliardy');
        $t_kw_6 = array('trylion', 'trylionów', 'tryliony');
        $t_kw_5 = array('biliard', 'biliardów', 'biliardy');
        $t_kw_4 = array('bilion', 'bilionów', 'bilony');
        $t_kw_3 = array('miliard', 'miliardów', 'miliardy');
        $t_kw_2 = array('milion', 'milionów', 'miliony');
        $t_kw_1 = array('tysiąc', 'tysięcy', 'tysiące');
        $t_kw_0 = array('złoty', 'złotych', 'złote');

        if ($kw != '') {
            $kw = (substr_count($kw, ',') == 0) ? $kw . ',00' : $kw;
            $tmp = explode(",", $kw);
            $ln = strlen($tmp[0]);
            $tmp_a = ($ln % 3 == 0) ? (floor($ln / 3) * 3) : ((floor($ln / 3) + 1) * 3);
            $l_pad = '';
            for ($i = $ln; $i < $tmp_a; $i++) {
                $l_pad .= '0';
                $kw_w = $l_pad . $tmp[0];
            }
            @$kw_w = ($kw_w == '') ? $tmp[0] : $kw_w;
            $paczki = (strlen($kw_w) / 3) - 1;
            $p_tmp = $paczki;
            $kw_slow = '';
            for ($i = 0; $i <= $paczki; $i++) {
                $t_tmp = 't_kw_' . $p_tmp;
                $p_tmp--;
                $p_kw = substr($kw_w, ($i * 3), 3);
                @$kw_w_s = ($p_kw{1} != 1) ? $t_a[$p_kw{0}] . ' ' . $t_b[$p_kw{1}] . ' ' . $t_c[$p_kw{2}] : $t_a[$p_kw{0}] . ' ' . $t_d[$p_kw{2}];
                if (($p_kw{0} == 0) && ($p_kw{2} == 1) && ($p_kw{1} < 1))
                    $ka = ${$t_tmp}[0]; //możliwe że $p_kw{1}!=1
                else if (($p_kw{2} > 1 && $p_kw{2} < 5) && $p_kw{1} != 1)
                    $ka = ${$t_tmp}[2];
                else
                    $ka = ${$t_tmp}[1];
                $kw_slow.=$kw_w_s . ' ' . $ka . ' ';
            }
        }
        $text = $kw_slow . ' ' . $tmp[1] . '/100 gr';
        return $text;
    }

}

?>
