<?php



/**

 * Login.class [ MODEL ]

 * Responsável por autenticar, validar, e checar usuario do sistema de login!

 * 

 * @copyright (c) 2017, Welton Thierree TagPage

 */

class Login {



    private $Level;

    private $Email;

    private $Senha;

    private $Error;

    private $Result;



    /**

     * <b>Informar Level:</b> Informe o nÃ­vel de acesso mÃ­nimo para a Ã¡rea a ser protegida.

     * @param INT $Level = NÃ­vel mÃ­nimo para acesso

     */

    function __construct($Level) {

        $this->Level = (int) $Level;

    }



    /**

     * <b>Efetuar Login:</b> Envelope um array atribuitivo com Ã­ndices STRING user [email], STRING pass.

     * Ao passar este array na ExeLogin() os dados sÃ£o verificados e o login Ã© feito!

     * @param ARRAY $UserData = user [email], pass

     */

    public function ExeLogin(array $userData) {

        $this->Email = (string) strip_tags(trim($userData['user']));

        $this->Senha = (string) strip_tags(trim($userData['pass']));

        $this->setLogin();

    }



    function getResult() {

        return $this->Result;

    }



    function getError() {

        return $this->Error;

    }



    public function CheckLogin() {

        if ($this->Level == 3):

            $colum = "cliente";

        else:

            $colum = "usuario";

        endif;



        if (empty($_SESSION[$colum . 'login']) || $_SESSION[$colum . 'login'][$colum . '_nivel'] < $this->Level):

            unset($_SESSION[$colum . 'login']);

            return false;

        else:

            return true;

        endif;

    }

    

    public function PassGeneration($qtyCaraceters = 10) {

        //Letras minúsculas embaralhadas

        $smallLetters = str_shuffle('abcdefghijklmnopqrstuvwxyz');



        //Letras maiúsculas embaralhadas

        $capitalLetters = str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ');



        //Números aleatórios

        $numbers = (((date('Ymd') / 12) * 24) + mt_rand(800, 9999));

        $numbers .= 1234567890;



        //Caracteres Especiais

        $specialCharacters = str_shuffle('!@#$%*-');



        //Junta tudo

        $characters = $capitalLetters . $smallLetters . $numbers . $specialCharacters;



        //Embaralha e pega apenas a quantidade de caracteres informada no parâmetro

        $password = substr(str_shuffle($characters), 0, $qtyCaraceters);



        //Retorna a senha

        return $password;

    }



    //PRIVATE

    private function setLogin() {

        if (!$this->Email || !$this->Senha || !Check::Email($this->Email)):

            $senha = base64_encode($this->Senha);

            $this->Error = ["Informe seu E-mail e senha para efetuar o login {$senha}", WS_INFOR];

            $this->Result = false;

        elseif (!$this->getUser()):

            $this->Error = ['Os dados informados não são compativeis', WS_ALERT];

            $this->Result = false;

        elseif (($this->Level != 3) && ($this->Result['usuario_nivel'] < $this->Level)):

            $this->Error = ["Desculpe {$this->Result['usuario_nome']}, você não tem permissão para acessar esta área", WS_ERROR];

            $this->Result = false;

        elseif (($this->Level != 3) && ($this->Result['usuario_status'] != 1)):

            $this->Error = ["Desculpe <b>{$this->Result['usuario_nome']}</b>, sua conta está bloqueada!", WS_INFOR];

            $this->Result = false;

        else:

            $this->Execute();

        endif;

    }



    private function getUser() {

        $this->Senha = base64_encode($this->Senha);

        if ($this->Level == 3):

            $table = "tp_clientes";

            $colum = "cliente";

        else:

            $table = "tp_usuarios";

            $colum = "usuario";

        endif;



        $read = new Read;

        $read->ExeRead($table, "WHERE {$colum}_email = :e AND {$colum}_senha = :p", "e={$this->Email}&p={$this->Senha}");

        if ($read->getResult()):

            //setando os dados do usuário

            $Result = $read->getResult()[0];

            

            //se o nivel do usuario for cliente, buscar o endereço

            if ($this->Level == 3):

                $ReadEnd = new Read;

                $ReadEnd->ExeRead("tp_cliente_enderecos", "WHERE cliente_id = :cliente_id AND cliente_endereco_principal = 1", "cliente_id={$read->getResult()[0]['cliente_id']}");

                //se possui endereço, setar os dados do endereço

                if ($ReadEnd->getResult()):

                    $Result['endereco'] = $ReadEnd->getResult()[0];

                endif;

            endif;



            $this->Result = $Result;

            return true;

        else:

            return false;

        endif;

    }

    

    private function registraAcesso(){

        $Dados['usuario_id'] = $this->Result['usuario_id'];

        $Dados['usuario_nome'] = $this->Result['usuario_nome'];

        $Dados['acesso_data'] = date('Y-m-d H:i:s');

        

        $Create = new Create;

        $Create->ExeCreate("tp_acessos", $Dados);

        return $Create->getResult();

    }



    private function Execute() {

        if (!session_id()):

            session_start();

        endif;



        if ($this->Level == 3):

            $colum = "cliente";

        else:

            $colum = "usuario";

        endif;

        

        //registrar o acesso

        $this->registraAcesso();

        

        $_SESSION[$colum . 'login'] = $this->Result;

        $this->Error = ["Olá {$this->Result[$colum . '_nome']}, seja bem vindo(a). Aguarde redirecionamento!", WS_ACCEPT];

        $this->Result = true;

    }



}

