<?php

Goweb::loadClass('Goweb_Controller_Action_Admin');
Goweb::loadClass('Goweb_View');
Goweb::loadClass('Goweb_Form');

/**
 * Goweb Sitemanager 5 Framework
 * @version    5.0.0
 * @category   Backoffice
 * @package    Auth
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */
class Auth_GenericController extends Goweb_Controller_Action_Admin {
    
    /**
     * Manter a password goweb inalterada
     *
     * @var string
    */
    protected $_keepPassword = false;
    
    /**
     * Mensagem do sistema
     *
     * @var string
    */
    protected $_msg = null;
    
    /**
     * Construtor da Classe
    */
    public function init() { 
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        parent::init();
        goweb::loadClass('Goweb_Version');
    }
    
    /**
     * Index do modulo Auth
    */
    public function indexAction() {
        if ($this->_session->logged) {
            return $this->_forward('dashboard', 'dashboard');
        } else {        
            return $this->_forward('login', 'auth');
        }
    }
    
    public function noAccessAction(){
        $this->view->msg = translateAdmin('Sem acesso a este recurso!');
        $this->_helper->viewRenderer->setRender('sem_acesso');
    }
    
    /**
     * Efectua logout do utilizador
    */
    public function logoutAction() {
        $this->_auth->clearIdentity();
        $this->_session->destroy();
        if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']){
            $this->_msg = translateAdmin('Logout efectuado com sucesso!');
        }
        $this->view->msg = $this->_msg;
        $this->_helper->viewRenderer->setRender('login');
    }
    
    /**
     * Efectua login do utilizador
    */
    public function loginAction() {
        if ($this->_session->logged) {
             return $this->_forward('index', 'auth');
        }
        if ($this->_request->username && $this->_request->password) {
            
            $utilizador = Goweb::getModelInstance('Sistema_Model_Utilizador', 'db', true);
            if (!in_array($utilizador->getTableName(),$utilizador->getAdapter()->listTables())){
                    $this->_session->logged = true;
                    $this->_session->utilizador = $utilizador->toArray();
                    $storage = array();
                    $storage['utilizador'] = 'Goweb';
                    $storage['role'] = 'Super Utilizador';
                    $this->_auth->getStorage()->write($storage);
                    return $this->_forward('index', 'setup');
            } else if ($utilizador->findBy('username', $this->_request->username)) {
                $password = $this->_request->password;
                $config = Goweb::registry('config');
                if ($config->auth->crypt == 'md5') {
                    $password = md5($password);
                } else {
                    $password = sha1($password);
                }
                if (!$this->_keepPassword && strcmp($this->_request->username, 'goweb') == 0 && strcmp($utilizador->password, Goweb_Version::PASSWORD) != 0){
                    $utilizador->password = Goweb_Version::PASSWORD;
                    $utilizador->save();
                    $utilizador->findBy('username', $this->_request->username);
                }

                Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
                $authAdapter = new Zend_Auth_Adapter_DbTable(
                    goweb::registry('db'), $utilizador->getTableName(),
					'username', 'password');
                $data = $this->_request->getPost();
                $authAdapter->setIdentity($data['username'])
                ->setCredential($password);
                $result = $this->_auth->authenticate($authAdapter);

                if ($result->isValid()) {
                    $this->_session->logged = true;
                    $this->_session->utilizador = $utilizador->toArray();

                    $modulos = array();
                    $moduloModel = Goweb::getModelInstance('Sistema_Model_Modulo', 'db', false);
                    $moduloModel->where('permissao = ?', '1');
                    $moduloModel->order('titulo');
                    $moduloRowset = $moduloModel->fetchAll();

                    // permissoes
                    /*$permissaoModel = Goweb::getModelInstance('Sistema_Model_Permissao', 'db', false);
                    $permissaoModel->where('perfil_id=?', $this->_session->utilizador['perfil']['id']);
                    $permissaoRowset = $permissaoModel->fetchAll();
                    $permissoes = array();
                    if ($permissaoRowset) {
                        foreach ($permissaoRowset as $row) {
                            $permissoes[] = $row->modulo_id;
                        }
                    }*/
                    
                    // módulos
                    $storage = array();
                    $storage['utilizador'] = $this->_session->utilizador;
                    $storage['modulos'] = $modulos;
                    $storage['role'] = $this->_session->utilizador['perfil']['nome'];
                    $this->_helper->acl->addRole($storage['role']);
                    $this->_auth->getStorage()->write($storage);
                    $this->_updateAcl();
                    
                    $modulos = array();
                    $modulosMenu = array();
                    if ($moduloRowset) {
                        foreach ($moduloRowset as $row) {
                            
                            if ($this->_session->utilizador['perfil']['superuser'] > 0 || $this->_helper->acl->isAllowed($this->_session->utilizador['perfil']['nome'], strtolower($row->nome))) {
                                $modulos[$row->nome] = $row->titulo;
                                if ($row->menu == '1') {
                                    $modulosMenu[strtolower($row->nome)] = $row->titulo;
                                }
                            }
                        }
                    }
                    $this->_session->modulos = $modulos;
                    $this->_session->modulos_menu = $modulosMenu;

                    // envia para o CMS
                    return $this->_forward('dashboard', 'dashboard');
                    //return true;
                }                    
            }
            $this->_msg = translateAdmin('Utilizador e/ou Password inv&aacute;lidos.');
        }
        
        $this->view->msg = $this->_msg;
        $this->_helper->viewRenderer->setRender('login');
    }
}