<?php

Goweb::loadClass('Goweb_Setup');
Goweb::loadClass('Goweb_Version');

/**
 * Goweb Sitemanager 5 Framework
 * @version    5.0.21
 * @category   Frontoffice
 * @package    Sistema
 * @subpackage Setup
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2010 (c) Goweb (http://www.goweb.pt)
 *
 * As classes _Setup sao utilizadas para a criacao das tabelas
 * relativas aos Models dos Modulos.
 * Para cada Modulo existente no sistema existem ficheiros (Models)
 * que modelam a base de dados.
 * A partir destes Models que o Setup cria as tabelas referentes
 * aos modulos do sistema a ser instalado.
 *
 */

class Sistema_Setup extends Goweb_Setup {

    /**
     * Nome do modulo
     *
     * @var string
     */
    protected $_nome       = 'Sistema';

    /**
     * Titulo do modulo
     *
     * @var string
     */
    protected $_titulo     = 'Sistema base';

    /**
     * Modulo pertence ao menu do backoffice
     *
     * @var boolean
     */
    protected $_menu       = false;

    /**
     * Permitir inclusao de componentes
     *
     * @var boolean
     */
    protected $_componente = false;

    /**
     * Permitir pesquisa no modulo
     *
     * @var boolean
     */
    protected $_pesquisa   = false;

    /**
     * Modulo sujeito a permissoes de utilizadores
     *
     * @var boolean
     */
    protected $_permissao  = false;

    /**
     * Este metodo adiciona os Models necessarios ao
     * setup do modulo.
     */
    public function initModels() {
        $this->addModel('Sistema_Model_Utilizador');
        $this->addModel('Sistema_Model_Perfil');
        $this->addModel('Sistema_Model_Lingua');
        $this->addModel('Sistema_Model_Modulo');
        $this->addModel('Sistema_Model_Permissao');
        $this->addModel('Sistema_Model_CmsPermissao');
        $this->addModel('Sistema_Model_Action');
    }


    /**
     * Este metodo faz uma inicializacao default dos dados necessaria
     * ao funcionamento do Modulo e/ou com intuito de
     * facilitar o Cliente.
     */
    public function initDefaultData() {
        // Perfil - Superuser
        $perfil = Goweb::getModelInstance('Sistema_Model_Perfil', 'db');
        if (!$perfil->find('1')) {
            $perfil->nome = 'Super Utilizador';
            $perfil->superuser = '1';
            $perfil->activo = '1';
            $perfil->save();
        }

        // Lingua
        $lingua = Goweb::getModelInstance('Sistema_Model_Lingua', 'db');
        if (!$lingua->find('1')) {
            $lingua->nome = html_entity_decode('Portugu&ecirc;s', ENT_NOQUOTES, CHARSET);

            $lingua->activo = '1';
            $lingua->perfix = 'pt';
            $lingua->save();
        }
        // Utilizador - Superuser
        $utilizador = Goweb::getModelInstance('Sistema_Model_Utilizador', 'db');
        if (!$utilizador->find('1')) {
            $config = Goweb::registry('config');
            $utilizador->perfil_id = '1';
            $utilizador->nome = 'Super Utilizador';
            $utilizador->username = 'goweb';
            $utilizador->email = 'suporte@goweb.pt';
            $utilizador->password = Goweb_Version::PASSWORD;
            $utilizador->activo = '1';
            $utilizador->lingua_id = '1';
            $utilizador->save();
        }
        $moduloModel = Goweb::getModelInstance('Sistema_Model_Modulo', 'db');
        $actionModel = Goweb::getModelInstance('Sistema_Model_Action', 'db');
        $paginas = $moduloModel->fetchAll();

        if ($paginas) {
            foreach ($paginas as $pagina) {
                if (file_exists(APPLICATION_PATH . '/' . $pagina->nome . '/Controller.php')){
                    $accoes = $this->_getClassActions(APPLICATION_PATH . '/' . $pagina->nome . '/Controller.php', $pagina->nome . '_Controller');
                    if ($accoes && count($accoes)>1){
                        foreach ($accoes as $accao){
                            $actionModel->where($actionModel->getTableName() . '.modulo_id = ?', $pagina->id);
                            $actionModel->where($actionModel->getTableName() . '.nome = ?', $accao);
                            if (!$actionModel->fetchAll()){
                                $actionModel->reset();
                                $actionModel->modulo_id = $pagina->id;
                                $actionModel->nome = $accao;
                                if ($actionModel->colExists('nome_traduzido')){
                                    $actionModel->nome_traduzido = $accao;
                                }
                                $actionModel->titulo = $accao;
                                $actionModel->save();
                            }
                        }
                    }
                }
            }
        }
        if (!in_array('is_browser', $perfil->getAdapter()->listTables()) ) {
            $sqlDir = APPLICATION_PATH . '/Sistema/';
            $sqlFile = 'stats_clean';
            if (is_file($sqlDir . $sqlFile . '.sql')) {
                $perfil->getAdapter()->query(file_get_contents($sqlDir . $sqlFile . '.sql'));
            }
        }
    }

    /**
     * Obter as ações de um controller
     *
     * @param String $file path para o controller
     * @param String $className nome da classe do controller
     * @return array com as ações do controller
     */
    protected function _getClassActions($file, $className = null){
        if (!file_exists($file)) return array();
        $arr_methods = array();
        require_once $file;
        $arr = get_class_methods($className);
        foreach ($arr as $line) {
            if (substr($line,0,1) !== '_' && substr($line,-6) === 'Action') {
                $arr_methods[] = substr($line,0,-6);
            }
        }
        return $arr_methods;
    }
}