<?php
/**
 * Arquivo de declaração da classe Util.
 */
final class Util
{
    /**
     * Nome do site.
     *
     * @var string
     */
    public static $siteNome = 'CAPPEN.COM';

    /**
     * Url do site.
     *
     * @var string
     */
    public static $siteUrl = 'http://www.cappen.com';
    /**
     * Atributo com o titulo do sistema, utilizando tanto no HTML, como em alguns envios de emails.
     *
     * @var string
     */
    private static $tituloSistema = 'Cappen CMS';

    /**
     * Atributo para definir a pasta base do sistema.
     *
     * @var string
     */
    private static $pathBase;

    /**
     * Método para setar Pasta Base do sistema.
     *
     * @param string $pathBase
     */
    public static function setPathBase($pathBase)
    {
        Util::$pathBase = $pathBase;
    }

    /**
     * Método para retornar Pasta Base do sistema.
     *
     * @return string
     */
    public static function getPathBase()
    {
        return Util::$pathBase;
    }

    /**
     * Método para retornar a baseDir do sistema.
     *
     * @return string
     */
    public static function baseDir()
    {
        $baseDir = $_SERVER['DOCUMENT_ROOT'] . Util::getPathBase();

        return $baseDir;
    }

    /**
     * Método para retornar a baseUrl do sistema.
     *
     * @return string
     */
    public static function baseUrl()
    {
        $baseUrl = (isset($_SERVER['HTTPS']) ? "https" : "http") . '://' . $_SERVER['SERVER_NAME'] . Util::getPathBase();

        return $baseUrl;
    }

    /**
     * Método para retornar o titulo do sistema.
     *
     * @return string
     */
    public static function tituloSistema()
    {
        return self::$tituloSistema;
    }

    /**
     * Método para montagem dos parametros da consulta.
     *
     * @param  string $referencia
     * @param  string $var
     * @param  string $tipo
     * @return array
     */
    public static function montaParametros($referencia = '', $var = '', $tipo = 'STR')
    {
        $retorno = array('referencia' => $referencia, 'valor' => $var, 'tipo' => $tipo);

        return $retorno;
    }

    /**
     * Gera código para debugar um array/objeto/variável.
     *
     * @param  mixed $string
     * @return mixed
     */
    public static function dump($string)
    {
        echo '<pre>';
        print_r($string);
        echo '</pre>';
    }

    /**
     * Método para retirar acentos gráficos de uma string.
     *
     * @param  string $str
     * @return string
     */
    public static function retiraAcento($str = '')
    {
        $acento = array('á', 'é', 'í', 'ó', 'ú', 'à', 'ê', 'õ', 'ü', 'ã', 'ç', 'ô', 'â', 'è', 'º', 'ª', 'Á', 'É', 'Í',
                            'Ó', 'Õ', 'Ã', 'Ü', );
        $semacento = array('a', 'e', 'i', 'o', 'u', 'a', 'e', 'o', 'u', 'a', 'c', 'o', 'a', 'e', '', '', 'A', 'E', 'I',
                            'O', 'O', 'A', 'U', );

        for ($i = 0; $i < sizeof($acento); ++$i) {
            $str = str_replace($acento[$i], $semacento[$i], $str);
        }

        return $str;
    }

    /**
     * Função para retirar os caracteres especiais.
     *
     * @param  string $str
     * @return string
     */
    public static function retiraCaracteres($str = '')
    {
        $comAcento = array('á', 'à', 'ã', 'â', 'é', 'è', 'ê', 'ë', 'í', 'ì', 'î', 'ï', 'ó', 'ò', 'õ', 'ô', 'ú', 'ù', 'û', 'ü', 'ç',
                'Á', 'À', 'Ã', 'Â', 'É', 'È', 'Ê', 'Í', 'Ì', 'Î', 'Ó', 'Ò', 'Ô', 'Õ', 'Ú', 'Ù', 'Û', 'Ç', '~', '^',
                '´', '`', '[', ']', 'º', 'ª', ',', '(', ')', '"', "'", '\\', '--', '.', ' ', '?', '!', ':', '¬', '"', '/', );
        $semAcento = array('a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'c',
                'A', 'A', 'A', 'A', 'E', 'E', 'E', 'I', 'I', 'I', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'C', ' ', ' ',
                ' ', ' ', '-', '-', '.', '.', '', '-', '-', '”', ' ', '\\', '-', ' ', '', '-', '-', '', '', '', '', '-', );
        $str = str_replace($comAcento, $semAcento, $str);

        return strtolower($str);
    }

    /**
     * Método para tratamento de erro na camada de dados. Um e-mail será enviado para o analista responsável
     * e uma mensagem mais amigavel será exibida para o usuário final.
     *
     * @param  string $msgErro Erro gerado pelo banco
     * @param  string $txtSql  Instrução SQL que o sistema tentou executar
     * @param  string $arquivo Nome do arquivo
     * @param  string $classe  Nome da classe
     * @param  string $metodo  Nome do método
     * @param  string $linha   Número da linha
     * @return string
     */
    public static function trataErroDB($msgErro = '', $txtSql = '', $arquivo = '', $classe = '', $metodo = '', $linha = '')
    {
        $texto = '<html><head><title>' . Util::tituloSistema() . '</title></head><body>
        <table><tr><td>
        Caro Sr. Analista,<br /><br />
        O sistema <b>- ' . Util::tituloSistema() . ' -</b> emitiu a seguinte mensagem de erro: <br /><br />
        <b>Data    :</b> ' . @date('d/m/Y H:i:s') . '<br />
        <b>Mensagem:</b> ' . $msgErro . '<br />
        <b>Txt SQL :</b> ' . $txtSql . '<br />
        <b>Arquivo :</b> ' . $arquivo . '<br />
        <b>Classe  :</b> ' . $classe . '<br />
        <b>Método  :</b> ' . $metodo . '<br />
        <b>Linha   :</b> ' . $linha . '<br /><br />
        Atenciosamente,<br />
        Classe Util - Método trataErroDB <br />
        </td></tr></table>
        <div class="footer" align="center">
                <div align="center">
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
            <tr><td colspan="3" align="right">&nbsp;&nbsp;&nbsp;</td></tr>
                <tr align="center">
                  <td width="20%"></td>
                  <td width="45%"></td>
                  <td width="25%"><div></div></td>
                </tr>
              </table>
                </div>
        </div>
        </body></html>';
        $headers = "MIME-Version: 1.0\n";
        $headers .= "Content-Type: text/html; charset=\"ISO-8859-1\"\n";
        $headers .= "From: suporte@cappen.com\r\n";

        //mail("rafael@cappen.com,suporte@cappen.com","ERRO DB - ".Util::tituloSistema(), $texto, $headers);
        $msgUsuario = 'Um erro foi detectado durante a sua operacao. Um e-mail foi enviado para o analista responsável. <br />' . $texto;

        return $msgUsuario;
    }

    /**
     * Método estático para verificar os campos vazios nos métodos das listagens.
     *
     * Ex: verficaCampo($condicao, "WHERE")
     *
     * @param  string $campo
     * @param  string $string
     * @return string
     */
    public static function verificaCampo($campo = '', $string = '')
    {
        if ('' !== $campo) {
            $campo = $string . ' ' . $campo;
        }

        return $campo;
    }

    /**
     * Método que irá tirar todos os caracteres especiais da string.
     *
     * @param  string $string
     * @return string
     */
    public static function trataCaracteres($string = '')
    {
        $string = str_replace('INSERT', '', $string);
        $string = str_replace('insert', '', $string);
        $string = str_replace('DELETE', '', $string);
        $string = str_replace('delete', '', $string);
        $string = str_replace('ALTER', '', $string);
        $string = str_replace('alter', '', $string);
        $string = str_replace('DROP', '', $string);
        $string = str_replace('drop', '', $string);
        $string = str_replace('TRUNCATE', '', $string);
        $string = str_replace('truncate', '', $string);
        $string = str_replace('SELECT', '', $string);
        $string = str_replace('select', '', $string);
        $string = strip_tags($string);

        return $string;
    }

    /**
     * Procura valor em uma chave de um array.
     *
     * Ex: search($data, 'nome', 'Cappen')
     *
     * @param  array $array
     * @param  string $key
     * @param  string $value
     * @return bool
     */
    public static function search($array = array(), $key = '', $value = '')
    {
        $results = array();

        if (is_array($array)) {
            if (isset($array[$key]) && $array[$key] == $value) {
                $results[] = $array;
            }

            foreach ($array as $subarray) {
                $results = array_merge($results, self::search($subarray, $key, $value));
            }
        }

        return $results;
    }

    /**
     * Gera slug.
     *
     * @param  string $text
     * @return string
     */
    public static function slugify($text = '')
    {
        // replace non letter or digits by -
        $text = preg_replace('~[^\\pL\d]+~u', '-', $text);

        // trim
        $text = trim($text, '-');

        // transliterate
        $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

        // lowercase
        $text = strtolower($text);

        // remove unwanted characters
        $text = preg_replace('~[^-\w]+~', '', $text);

        if (empty($text)) {
            return 'n-a';
        }

        return $text;
    }

    /**
     * Método para verificar a força de uma senha.
     *
     * @param  string $senha
     * @return boolean
     */
    public static function checkPasswordStrong($senha = '')
    {
        $path = realpath(dirname(__FILE__) . '/passwordlist.txt');
        $lista = file($path, FILE_IGNORE_NEW_LINES);

        return (false === in_array($senha, $lista)) ? true : false;
    }

    /**
     * Gerar caracteres aleatórios.
     *
     * @param  int $length
     * @return string
     */
    public static function randomString($length = 10)
    {
        $chars = 'abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789';
        $string = '';

        $alphaLength = strlen($chars) - 1;

        for ($i = 0; $i < $length; ++$i) {
            $n = rand(0, $alphaLength);
            $string .= $chars[$n];
        }

        return $string;
    }

    /**
     * Método para verificar se a senha é forte ou fraca
     * contendo: letras maiúsculas, minusculas, números e caracteres especiais.
     *
     * @source: http://stackoverflow.com/questions/10752862/password-strength-check-in-php
     * @source: http://www.cafewebmaster.com/check-password-strength-safety-php-and-regex
     *
     * @param  string  $str
     * @return boolean
     */
    public static function isPasswordGood($str = '')
    {
        if (preg_match('#.*^(?=.{6,20})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*$#', $str)) {
            return true;
        }
        return false;
    }

    /**
     * Registra um log de erros.
     *
     * @param  string $msg
     */
    public static function errorLog($msg = '')
    {
        error_log($msg, 3, dirname(__FILE__) . '/../../error_cms');
    }

    /**
     * Limpa uma string e deixa somente números.
     *
     * @param  string $string
     * @return string
     */
    public static function onlyNumbers($string = '')
    {
        return preg_replace('/[^0-9]/', '', $string);
    }

    /**
     * Método para redirecionar.
     *
     * @param  string $url
     */
    public static function redirect($url = '')
    {
        header('Location: ' . $url);
        exit;
    }

    /**
     * Método para verificar se o usuário possui acesso.
     *
     * @param  string $pagina
     * @param  string $metodo
     * @param  string $redirect
     */
    public static function verificaAcesso($pagina = '', $metodo = '', $redirect = '')
    {
        $acesso = Acesso::check($pagina);

        if (!$acesso->{$metodo}()) {
            Message::error('Você não tem permissão para acessar essa página.');
            Util::redirect(Util::baseUrl() . 'cms/' . $redirect);
        }
    }

    public static function ajustarDataHoraVitrine($dataHora)
	{
	
		$separador	= explode(" ",$dataHora);
		$dataHora	= $separador[0];
		$ano		= substr($dataHora,0,4);
		$mes		= substr($dataHora,5,2);
		$dia		= substr($dataHora,8,2);
		$hora		= $separador[1];
		$hora		= substr($hora,0,strlen($hora)-3);
		$mes 		= Util::mesExtenso($mes);
		$retorno	= $mes." de ".$ano;
		return $retorno;
		
	}	
    
    	
    public static function dataBr($dataHora)
	{
	
		$separador	= explode(" ",$dataHora);
		$data	=  explode("-",$separador[0]);
		$ano		=  $data[0];
		$mes		=  $data[1];
		$dia		=  $data[2];
		$retorno	= $dia.'/'.$mes."/".$ano;
		return $retorno;
		
	}	
    
    	
    public static function dataIng($dataHora)
	{
		$data	= explode("/",$dataHora);
		$dia		= $data[0];
		$mes		= $data[1];
		$ano		= $data[2];
        $retorno	= $ano.'-'.$mes.'-'.$dia;
        
		return $retorno;
		
	}	
    
    	
	// retorna o mes por extenso
	public static function mesExtenso($mes) {
	
		$arrayMes = array('Janeiro' , 'Fevereiro', 'Março'   , 'Abril', 
						  'Maio'    , 'Junho'    , 'Julho'   , 'Agosto', 
						  'Setembro', 'Outubro'  , 'Novembro', 'Dezembro');
		
		$mes = $mes - 1;
		return $arrayMes[$mes]; 
	}
}
