<?php

Goweb::loadClass('Goweb_Controller_Action');
Goweb::loadClass('Goweb_View');

/**
 * Goweb Sitemanager 5 Framework
 * @version    5.1.5
 * @category   Frontoffice
 * @package    Utilizadores
 * @subpackage Controller
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2010 (c) Goweb (http://www.goweb.pt)
 *
 * A classe _Controller para o Front-Office disponibiliza
 * as accoes referentes a cada Modulo.
 *
 */
class Utilizadores_GenericController extends Goweb_Controller_Action {

    /**
     * canal a ser usado neste controller
     *
     * @var String
     */
    protected $_canal = 'base';

    /**
     * Mensagem de sucesso
     *
     * @var string
     */
    protected $_message = null;

    /**
     * Mensagem de erro
     *
     * @var string
     */
    protected $_error = null;
    
    /**
     * campo a ser usado para o login
     *
     * @var String
     */
    protected $_loginField = 'email';

    /**
     * utilizador activo por omissão
     *
     * @var String
     */
    protected $_activo = '1';

    /**
     * Construtor da Classe
     */
    public function init() {
        parent::init();
        $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Utilizadores');
    }

    /**
     * Acao executada se nenhuma outra acao for especificada
     */
    public function indexAction() {
        if ($this->_session->logged) {
            $this->view->titulo = translate('Os meus detalhes');
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            Cms_Controller::renderOutput($this->view,
                                        'dashboard.tpl',
                                        'Utilizadores',
                                        'utilizadores-dashboard',
            translate('Bem-vindo'));
            $this->_helper->viewRenderer->setRender($this->_canal);
        } else {
            $this->_forward('login', 'utilizadores');
        }
    }
    /**
     * Acao para redirecionar o output para o my count
     */
    public function mycountAction() {
        if ($this->_session->logged) {
            $translate = Zend_Controller_Router_Route::getDefaultTranslator();
            $modulo = $translate ? $translate->_($this->_getParam('controller')) : 'utilizadores';
            if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], $modulo) === false) return $this->_redirect($_SERVER['HTTP_REFERER']);
            return $this->_redirect('/cms/');
            
        } else {
            return $this->_forward('login', 'utilizadores');
        }
    }

    /**
     * Acao que efectua o login do utilizador no front-office
     */
    public function loginAction() {
         
        if ($this->_request->isPost()) {
            $utilizador = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);

            if ($utilizador->findBy($this->_loginField, $this->_request->username) && $utilizador->activo > 0) {
                $password = sha1($this->_request->password);
                if ($utilizador->password == $password) {

                    $this->_session->logged = true;
                    $this->_session->utilizador = $utilizador->toArray();
                    if (isset($this->_session->utilizador['morada'])) {
                        $this->_session->utilizador['morada_entrega'] = $this->_session->utilizador['morada'];
                    }
                    if (isset($this->_session->utilizador['cod_postal'])) {
                        $this->_session->utilizador['cod_postal_entrega'] = $this->_session->utilizador['cod_postal'];
                    }
                    if (isset($this->_session->utilizador['localidade'])) {
                        $this->_session->utilizador['localidade_entrega'] = $this->_session->utilizador['localidade'];
                    }
                    if (isset($this->_session->utilizador['pais_id'])) {
                        $this->_session->utilizador['pais_id_entrega'] = $this->_session->utilizador['pais_id'];
                    }
                    return $this->_forward('mycount', 'utilizadores');
                }
            }
            $this->_error = translate('Utilizador e/ou Password inv&aacute;lidos.');
        }

        $this->view->error = $this->_error;
         
        if ($this->_directRequest) { // significa que foi chamado directamente.
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            //Cms_Controller::
            Cms_Controller::renderOutput($this->view,
                                    'login.tpl',
                                    'Utilizadores',
                                    'utilizadores-login',
            translate('Login'));
            $this->_helper->viewRenderer->setRender($this->_canal);
        }

    }


    /**
     * Acao que efectua o logout do utilizador no front-office
     */
    public function logoutAction() {
        unset($this->_session->logged);
        unset($this->_session->utilizador);

        Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
        Cms_Controller::renderOutput($this->view,
                                    'logout.tpl',
                                    'Utilizadores',
                                    'utilizadores-logout',
        translate('Logout'), 0, false);
        $this->_helper->viewRenderer->setRender($this->_canal);
    }

    /**
     * Acao que exibe o formulario de login
     */
    public function loginBlockAction() {
        if (!$this->_session->logged) {
            $this->_helper->viewRenderer->setRender('block_login');
        } else {
            $this->_helper->viewRenderer->setRender('block_utilizador');
        }
    }

    /**
     * Acao que exibe o formulario de Registo de um novo utilizador
     */
    public function formRegistoAction() {
        Goweb::loadClass('Form_Utilizador', dirname(__FILE__));

        $form = new Form_Utilizador('registo', '/utilizadores/save_registo/');
        $form->render();
        $this->view->form = $form;
        $this->view->error = null;
        if ($this->_directRequest) { // significa que foi chamado directamente.
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            Cms_Controller::renderOutput($this->view,
                                        'form-registo.tpl',
                                        'Utilizadores',
                                        'utilizadores-form-registo',
            translate('Registo de Utilizadores'));
            $this->_helper->viewRenderer->setRender($this->_canal);
        }
    }

    /**
     * Acao que efectua o registo do utilizador na base de dados
     */
    public function saveRegistoAction() {
        Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
        Goweb::loadClass('Form_Utilizador', dirname(__FILE__));

        $form = new Form_Utilizador('registo', '/utilizadores/save_registo/');
        if ($form->validate()) {
            $utilizadorModel = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);
            $utilizadorModel = $this->_formModelValues($form, $utilizadorModel);
            if ($utilizadorModel->colExists('perfil_id')) $utilizadorModel->perfil_id = '1';
            $session = Goweb::registry('session');
            if ($utilizadorModel->colExists('lang')) $utilizadorModel->lang = $session->lang;
            if ($utilizadorModel->colExists('activo')) $utilizadorModel->activo = $this->_activo;
            $utilizadorModel->save();
            	
            if($utilizadorModel->activo) {
                $this->_session->logged = true;
                $this->_session->utilizador = $utilizadorModel->toArray();
                if (isset($this->_session->utilizador['morada']))
                    $this->_session->utilizador['morada_entrega'] = $this->_session->utilizador['morada'];
                if (isset($this->_session->utilizador['morada']))
                    $this->_session->utilizador['cod_postal'] = $this->_session->utilizador['cod_postal'];
                if (isset($this->_session->utilizador['localidade']))
                    $this->_session->utilizador['localidade_entrega'] = $this->_session->utilizador['localidade'];
                if (isset($this->_session->utilizador['pais_id']))
                    $this->_session->utilizador['pais_id_entrega'] = $this->_session->utilizador['pais_id'];
                return $this->_forward('mycount', 'utilizadores');
            }



            // envio de email
            Goweb::loadClass('Goweb_Mail');
            $mail = new Goweb_Mail();

            $mail->addTo($utilizadorModel->email, $utilizadorModel->nome);
            $mail->setSubject(html_entity_decode(translate("Activa&ccedil;&atilde;o de conta"), ENT_NOQUOTES, CHARSET));
            $this->view->utilizador = $utilizadorModel->getRow();
            $this->view->config = Goweb::registry('config');
            $this->view->output = $this->view->render('email-activacao.tpl');
            $this->view->setViewsPath(VIEWS_PATH);
            $mail->setBodyHtml($this->view->render('email.tpl'));
            try {
                $mail->send();
            } catch (Exception $e) {
                // nao faz nada
            }

            $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Utilizadores');
            if ($this->_directRequest){
                Cms_Controller::renderOutput($this->view,
                                            'registo-sucesso.tpl',
                                            'Utilizadores',
                                            'utilizadores-registo-sucesso',
                translate('Pedido de Registo de Utilizador'), 0, true);
                $this->_helper->viewRenderer->setRender($this->_canal);
            } else {
                $this->_helper->viewRenderer->setRender('registo-sucesso');
            }
        } else {
            $this->_error = translate('Por favor, corrija os erros no formul&aacute;rio.');
            $form->render();
            $this->view->form = $form;

            $this->view->message = $this->_message;
            $this->view->error = $this->_error;
            if ($this->_directRequest){
                Cms_Controller::renderOutput($this->view,
                                            'form-registo.tpl',
                                            'Utilizadores',
                                            'utilizadores-form-registo',
                translate('Registo de Utilizadores'), 0, true);
                $this->_helper->viewRenderer->setRender($this->_canal);
            } else {
                $this->_helper->viewRenderer->setRender('form-registo');
            }
        }
        
    }

    /**
     * Acao que efectua a activacao do utilizador na base de dados
     */
    public function activacaoAction() {
        Goweb::loadClass('Cms_Controller', APPLICATION_PATH);

        $utilizadorModel = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);
        $id = $this->_getParam('id');
        $codigo = $this->_getParam('codigo');

        if ($codigo && $this->_validateId($id) && $utilizadorModel->find($id) && $utilizadorModel->codigo_reset == $codigo) {
            $utilizadorModel->activo = '1';
            $utilizadorModel->save();
            Cms_Controller::renderOutput($this->view,
                                        'activacao-sucesso.tpl',
                                        'Utilizadores',
                                        'utilizadores-activacao-sucesso',
            translate('Sucesso na activa&ccedil;&atilde;o de conta'), 0, false);
        } else {
            Cms_Controller::renderOutput($this->view,
                                        'activacao-erro.tpl',
                                        'Utilizadores',
                                        'utilizadores-activacao-erro',
            translate('Erro na activa&ccedil;&atilde;o de conta'), 0, false);
        }
        $this->_helper->viewRenderer->setRender($this->_canal);
    }

    /**
     * Acao que exibe o formulario de registo de um utilizador
     */
    public function formAction() {
        $utilizadorModel = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);
        if (!$this->_session->logged || !$utilizadorModel->find($this->_session->utilizador['id'])) {
            return $this->loginAction();
            // return $this->_forward('cms', 'index');
        }
        $utilizador = $utilizadorModel->getRow();

        Goweb::loadClass('Form_Utilizador', dirname(__FILE__));
        $form = new Form_Utilizador('form', '/utilizadores/save/');
        //$form->email->readonly = true;

        foreach ($form->getElementsNames() as $element) {
            if ($element != 'password_confirm' && $form->getElement($element)->type != 'captcha') {
                $form->{$element}->value = strpos($utilizador->{$element}, 'a:') === 0 ? unserialize($utilizador->{$element}) : $utilizador->{$element};
            }
        }
        $form->render();
        $this->view->form = $form;

        $this->view->error = null;
        if ($this->_directRequest) { // significa que foi chamado directamente.
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            Cms_Controller::renderOutput($this->view,
                                        'form-utilizador.tpl',
                                        'Utilizadores',
                                        'utilizadores-form',
            translate('Dados do Utilizador'));
            $this->_helper->viewRenderer->setRender($this->_canal);
        } else {
            $this->_helper->viewRenderer->setRender('form-utilizador');
        }
    }

    /**
     * Acao que guarda os dados do novo utilizador na base de dados
     */
    public function saveAction() {
        $utilizadorModel = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);
        if (!$this->_session->logged || !$utilizadorModel->find($this->_session->utilizador['id'])) {
            return $this->loginAction();
        }
        $utilizador = $utilizadorModel->getRow();

        Goweb::loadClass('Form_Utilizador', dirname(__FILE__));
        $form = new Form_Utilizador('registo', '/utilizadores/save/');
        if ($this->_request->{$this->_loginField} == $utilizador->{$this->_loginField}) {
            $form->{$this->_loginField}->removeValidator('Goweb_Validate_Unique');
        }
        if (!$this->_request->password){
            $form->password->removeValidator('Goweb_Validate_Required');
            $form->password->setRequired(false);
            $form->password_confirm->removeValidator('Goweb_Validate_Required');
            $form->password_confirm->setRequired(false);
            $form->password_confirm->removeValidator('Goweb_Validate_SameAs');
        }
        if ($form->validate()) {
            $utilizadorModel->find($this->_session->utilizador['id']);
            $utilizadorModel = $this->_formModelValues($form, $utilizadorModel);
            $utilizadorModel->save();
            $this->_session->utilizador = $utilizador->toArray();
            $this->_message = translate('Os seus dados foram gravados com sucesso.');
            $this->view->form = false;
        } else {
            $this->_error = translate('Por favor, corrija os erros no formul&aacute;rio.');
        }

        $form->render();
        $this->view->form = $form;
        $this->view->message = $this->_message;
        $this->view->error = $this->_error;
        if ($this->_directRequest) { // significa que foi chamado directamente.
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            Cms_Controller::renderOutput($this->view,
                                        'form-utilizador.tpl',
                                        'Utilizadores',
                                        'utilizadores-form',
            translate('Dados do Utilizador'));
            $this->_helper->viewRenderer->setRender($this->_canal);
        } else {
            $this->_helper->viewRenderer->setRender('form-utilizador');
        }

    }

    /**
     * Acao que efectua a recuperacao de password
     */
    public function recuperarPasswordAction() {
        Goweb::loadClass('Cms_Controller', APPLICATION_PATH);

        if ($this->_request->isPost()) {
            $utilizadorModel = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);
            if ($utilizadorModel->findBy('email', $this->_request->email) && $utilizadorModel->activo) {
                Goweb::loadClass('Goweb_Mail');
                $mail = new Goweb_Mail();

                $mail->addTo($utilizadorModel->email, $utilizadorModel->nome);
                $mail->setSubject(html_entity_decode(translate("Recuperar password - confirma&ccedil;&atilde;o"), ENT_NOQUOTES, CHARSET));
                $this->view->utilizador = $utilizadorModel->getRow();
                $this->view->config = Goweb::registry('config');
                $this->view->output = $this->view->render('email-recuperar-password-passo1.tpl');
                $this->view->setViewsPath(VIEWS_PATH);
                $mail->setBodyHtml($this->view->render('email.tpl'));

                
                try {
                    $mail->send();
                } catch (Exception $e) {
                    // nao faz nada
                }
                if ($this->_directRequest){
                    $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Utilizadores');
                    Cms_Controller::renderOutput($this->view,
                                                'recuperar-password-sucesso-passo1.tpl',
                                                'Utilizadores',
                                                'utilizadores-recuperar-password-sucesso',
                    translate("Recupera&ccedil;&atilde;o de password"), 0, false);
                    $this->_helper->viewRenderer->setRender($this->_canal);
                } else {
                    $this->_helper->viewRenderer->setRender('recuperar-password-sucesso-passo1');
                }
                return true;
            } else { // utilizador nao registado
                $this->view->error = translate('O utilizador submetido n&atilde;o existe no sistema.');
            }
        } elseif ($this->_request->id && $this->_validateId($this->_request->id) && $this->_request->codigo){
            $utilizadorModel = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);
            if ($utilizadorModel->find($this->_request->id) && strcmp($utilizadorModel->codigo_reset, $this->_request->codigo) == 0 && $utilizadorModel->activo) {
                $password = $this->_generateCode();
                $this->view->password = $password;
                $utilizadorModel->password = sha1($password);
                $utilizadorModel->codigo_reset = $this->_generateCode();
                $utilizadorModel->save();
                $utilizadorModel->find($this->_request->id);
                Goweb::loadClass('Goweb_Mail');
                $mail = new Goweb_Mail();
                $this->view->loginField = $this->_loginField;
                $mail->addTo($utilizadorModel->email, $utilizadorModel->nome);
                $mail->setSubject(html_entity_decode(translate("Dados de Acesso"), ENT_NOQUOTES, CHARSET));
                $this->view->utilizador = $utilizadorModel->getRow();
                $this->view->config = Goweb::registry('config');
                $this->view->output = $this->view->render('email-recuperar-password-passo2.tpl');
                $this->view->setViewsPath(VIEWS_PATH);
                $mail->setBodyHtml($this->view->render('email.tpl'));


                try {
                    $mail->send();
                } catch (Exception $e) {
                    // nao faz nada
                }
                $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Utilizadores');
                if ($this->_directRequest){
                    Cms_Controller::renderOutput($this->view,
                                                'recuperar-password-sucesso-passo2.tpl',
                                                'Utilizadores',
                                                'utilizadores-recuperar-password-sucesso',
                    translate("Recupera&ccedil;&atilde;o de password"), 0, false);
                    $this->_helper->viewRenderer->setRender($this->_canal);
                } else {
                    $this->_helper->viewRenderer->setRender('recuperar-password-sucesso-passo2');
                }
                return true;
            }
            
        }
        $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Utilizadores');
        if ($this->_directRequest){
            Cms_Controller::renderOutput($this->view,
                                        'form-recuperar-password.tpl',
                                        'Utilizadores',
                                        'utilizadores-recuperar-password',
            translate("Formul&aacute;rio de recupera&ccedil;&atilde;o de password"));
            $this->_helper->viewRenderer->setRender($this->_canal);
        } else {
            $this->_helper->viewRenderer->setRender('form-recuperar-password');
        }
    }
    
    /**
     * Gera o codigo da password
     */
    protected function _generateCode($length = 6) {
        $validChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $code = '';
        while ($length > 0) {
            $code .= $validChars[rand(0,strlen($validChars)-1)];
            $length--;
        }
        return $code;
    }

    /**
     * Acao que efectua o envio de email para um
     * utilizador qd ele faz anos.
     *
     * Paulo Almeida
     */
    public function aniversarioAction() {
         
        Goweb::loadClass('Cms_Controller', APPLICATION_PATH);

        $utilizadorModel = Goweb::getModelInstance('Utilizadores_Model_Utilizador', 'db', false);
        $today = date("m-j");                       // 06-16

        $query = $utilizadorModel->getTableName() . '.data_nasc like "%'. $today .'%" ';
        $utilizadorModel->where($query);
        $users_Aniver = $utilizadorModel->fetchAll();
        // envio de email
        if($users_Aniver){
            Goweb::loadClass('Goweb_Mail');
            foreach($users_Aniver as $user){
                $mail = new Goweb_Mail();
                $mail->addTo($user->email, $user->nome);
                $mail->setSubject(html_entity_decode(translate("Feliz Anivers&aacute;rio"), ENT_NOQUOTES, CHARSET));
                $this->view->utilizador = $user;
                $this->view->config = Goweb::registry('config');
                $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Utilizadores');
                $this->view->output = $this->view->render('email-aniversario.tpl');
                $this->view->setViewsPath(VIEWS_PATH);
                $mail->setBodyHtml($this->view->render('email.tpl'));
                
                try {
                    $mail->send();
                } catch (Exception $e) {
                    // nao faz nada
                }
            }
        }
        $this->view->output='';
        $this->_helper->viewRenderer->setNoRender();
    }

    /**
     * Acao executada se a acao chamada nao existir neste modulo
     *
     * @param string
     * @param array
     */
    public function __call($action, $arguments) {
        if('Action' == substr($action, -6)) {
            $this->_forward('login', 'utilizadores');
        } else {
            throw new Goweb_Exception("A fun&ccedil;&atilde;o n&atilde;o existe em ". get_class($this));
        }
    }
}