<?php

Goweb::loadClass('Catalogo_GenericController', APPLICATION_PATH);

/**
 * Goweb Sitemanager 5 Framework
 * @version    5.0.0
 * @category   Frontoffice
 * @package    Catalogo
 * @subpackage Controller
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 *
 * A classe _Controller para o Front-Office disponibiliza
 * as accoes referentes a cada Modulo.
 *
 */
class Catalogo_Controller extends Catalogo_GenericController {
    /**
     * canal a ser usado neste controller
     *
     * @var String
     */
    protected $_canal = 'base';
	
	
	/**
     * Listagem dos produtos em Destaque
     */
    public function destaquesAction() {
	
        $nro_produtos = $this->_getParam('nro_produtos');
        if (!$nro_produtos && !$this->_validateId($nro_produtos)) {
            $nro_produtos = 1;
        }

		$array_produtos = array();
		$categoriaId = $this->_getParam('categoria_id');
		
		if($this->_validateId($categoriaId) || (!strcmp($categoriaId,"0")))
		{
			$produtoModel = Goweb::getModelInstance('Catalogo_Model_produto', 'db', false);
			$db = $produtoModel->getAdapter();
			$table = $produtoModel->getTableName();
			if(!strcmp($categoriaId,"0"))
			{
				$query = 'SELECT *  FROM ' . $table . ' WHERE activo = 1 AND destaque = 1 ';
				$query .= ' ORDER BY ordem';

				if(($produtos = $this->_customCache->load(md5($query))) === false) {
					$produtos = $db->fetchAll($query);
					$this->_customCache->save($produtos, md5($query));
				}
				$this->view->produtos = $produtos;
			}
			else
			{
				$query = 'SELECT *  FROM ' . $table . ' WHERE activo = 1 AND destaque = 1 ';
				$query .= ' ORDER BY ordem';

				if(($produtos = $this->_customCache->load(md5($query))) === false) {
					$produtos = $db->fetchAll($query);
					$this->_customCache->save($produtos, md5($query));
				}

				//$categoriaId valor 3 (string)
				$i = 0;
				foreach ($produtos as $produto)
				{
					if(in_array($categoriaId, $this->_getAllParents($produto['categoria_id'])))
						$array_produtos[$i++]= $produto;
				}
				$this->view->produtos = $array_produtos;
			}
        }
		else
			$this->view->produtos = NULL;

		$this->view->loja = $this->_moduleConfig->loja->activa;
		
        $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Catalogo');
        if ($this->_directRequest) { // significa que foi chamado directamente.
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            Cms_Controller::renderOutput($this->view,
                                         'destaque.tpl',
                                         'Catalogo',
                                         'catalogo-destaque',
            translate('Produtos em Destaque'),
            $this->_getParam('print'));
            $this->_helper->viewRenderer->setRender($this->_canal);
        } else {
            $this->_helper->viewRenderer->setRender('destaque');
        }
    }
	
	/**
     * Listar produtos ou categorias
     *
     * Se houver sub-categorias entao listar as categorias
     * Senao, listar os produtos daquela categoria
     */
    public function listAction() {
        $categoriaId = $this->_getParam('categoria_id');

        if (!$categoriaId) {
            $categoriaId = 0;
        }

        if ($this->_categoriaModel->colExists('url')){
            $sub = $this->_getLinkStart();
            $pathInfo = str_replace($sub, '', $this->_request->getPathInfo());
            if ($pathInfo == '/') $pathInfo = '';
            $translate = Zend_Controller_Router_Route::getDefaultTranslator();
            if (is_numeric(strpos($pathInfo, ($translate ? $translate->_('list') : 'list') . '/categoria_id')) && $this->_categoriaModel->find($categoriaId) && $this->_categoriaModel->url){
                return $this->_redirect($sub . '/' . $this->_categoriaModel->url . ($this->_request->page ? '?page=' . $this->_request->page : ''), array('code' => 301));
            }
        }
		
		if ($categoriaId == 0 || ($this->_validateId($categoriaId) && $this->_categoriaModel->find($categoriaId) && $this->_categoriaModel->activo) && $this->_getParam('showmenu'))
		{
			$this->_categoriaModel->order('ordem');
			$this->_categoriaModel->where($this->_categoriaModel->getTableName() . '.pai_id = ?', $categoriaId);
			$this->_categoriaModel->where($this->_categoriaModel->getTableName() . '.activo = 1');
			$this->_resultCategorias = $this->_categoriaModel->count();
			if ($this->_resultCategorias > 0) {
				return $this->listCategoriasAction($categoriaId);
			} elseif ($this->_getParam('showmenu')) {
				return $this->listProdutosDestaquesAction();
			}
			else
			{
				return $this->listProdutosAction();
			}
		} 
		else
		{
			return $this->listProdutosAction();
		}
    }
	
	/**
     * Listagem dos Produtos
     */
    public function listProdutosAction() {
		
        $page = $this->_request->page > 0 ? $this->_request->page : '1';

        // menu
        $menu = new Goweb_Js_JSCookMenu('categorias');

        // categoria_id
        $categoriaId = $this->_getParam('categoria_id');
		
        $rows = $this->_getParam('rows');
        $this->view->rows='';
        if ($this->_validateId($rows)) {
            $this->view->rows = '/rows/' . $rows;
        }
        if ($this->_validateId($categoriaId) && $this->_categoriaModel->find($categoriaId) && $this->_categoriaModel->activo) {
            $categoria = $this->_categoriaModel->getRow();
			$this->view->categoria_id = $categoria->id;
			$this->view->categorianome = $categoria->titulo;
        }
		else
		{
            $this->view->categoria_id = 0;
        }
		
		if($this->_getParam('showmenu'))
			$this->view->destaque = 1;
		else
			$this->view->destaque = -1;
        // paginator
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.categoria_id=?', $categoriaId);
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.activo=?', '1');
        $paginator = new Goweb_Paginator(Goweb::link('/catalogo/list/categoria_id/' . $categoriaId . $this->view->rows . '/', 'page='),
        $this->_produtoModel->count(),
        $page,
        $rows ? $rows : $this->_moduleConfig->paginator->rows_per_page,
        $this->_moduleConfig->paginator->links_per_page);

        $this->view->paginator = $paginator;
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->view->paginator_output = $this->view->render('paginator.tpl');

        $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Catalogo');

        // parametro para associar loja
        $this->view->loja = $this->_moduleConfig->loja->activa;

        // categorias
        $this->_categoriaModel->where($this->_categoriaModel->getTableName() . '.activo=?', '1');
        $this->_categoriaModel->loadForeigns(false);
        $this->_categoriaModel->order('ordem');
        $categoriasRowset = $this->_categoriaModel->fetchAll();
        $categorias = null;
        $categoriasList = array();
        if ($categoriasRowset) {
            foreach ($categoriasRowset as $row) {
                $menu->addNode($row->id,
                $row->pai_id,
                $row->titulo,
                               '',
                Goweb::link('/catalogo/list/categoria_id/' . $row->id . $this->view->rows .'/'));
            }
            $categoriasList = $menu->build(0);
        }
        $this->view->categorias_list = $categoriasList;

        // produtos
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.categoria_id=?', $categoriaId);
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.activo=?', '1');
        $this->_produtoModel->order('ordem');
        $this->_produtoModel->limitPage($paginator->getPage(), $paginator->getRowsPerPage());
        $produtos = $this->_produtoModel->fetchAll();
		$this->view->produtos = $produtos;
        $this->view->detail_url = '/catalogo/detail/id/';

		
		//braedcrumb
        //$titulo = $this->_caminho('0', $categoriaId);
		
		// elaboração do menu
		$categoriaModel = Goweb::getModelInstance('Catalogo_Model_Categoria', 'db', false);
		$db = $categoriaModel->getAdapter();
		$table = $categoriaModel->getTableName();

		$query = 'SELECT id, pai_id, titulo FROM ' . $table . ' WHERE activo = 1 ';
		$query .= ' order by ordem';
		if(($result = $this->_customCache->load(md5($query))) === false) {
			$result = $db->fetchAll($query);
			$this->_customCache->save($result, md5($query));
		}

		foreach($result as &$categoria)
		{
			$produtoModel = Goweb::getModelInstance('Catalogo_Model_produto', 'db', false);
			$db = $produtoModel->getAdapter();
			$table = $produtoModel->getTableName();

			$query = 'SELECT id FROM ' . $table . ' WHERE activo = 1 ';
			$query .= ' AND categoria_id = ' . $categoria['id'];
			$query .= ' limit 1';
					
			if(($produtos = $this->_customCache->load(md5($query))) === false) {
				$produtos = $db->fetchAll($query);
				$this->_customCache->save($produtos, md5($query));
			}
			if($produtos)
				$categoria['produtos'] = 1;
			else
				$categoria['produtos'] = 0;
		}
		
		$this->view->menu = $this->buildMenuAction($result, 0);
		

        // cms
        if ($this->_directRequest) { // significa que foi chamado directamente.
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            Cms_Controller::renderOutput($this->view,
                                        'list.tpl',
                                        'Catalogo',
                                        'catalogo-list',
            translate('PRODUTOS'),
            $this->_getParam('print'));
            $this->_helper->viewRenderer->setRender('base-catalogo2');
        } else {
            $this->_helper->viewRenderer->setRender('list');
        }
    }
	
	/**
     * Visualizar o detalhe do Produto
     */
    public function detailAction() {
        if ($this->_produtoModel->colExists('url')){
            $sub = $this->_getLinkStart();
            $pathInfo = str_replace($sub, '', $this->_request->getPathInfo());
            if ($pathInfo == '/') $pathInfo = '';
            $translate = Zend_Controller_Router_Route::getDefaultTranslator();
            if (is_numeric(strpos($pathInfo, ($translate ? $translate->_('detail') : 'detail') . '/id')) && $this->_produtoModel->find($this->_getParam('id')) && $this->_produtoModel->url){
                return $this->_redirect($sub . '/' . $this->_produtoModel->url, array('code' => 301));
            }
        }
        if ($this->_validateId($this->_getParam('id')) && $this->_produtoModel->find($this->_getParam('id')) && $this->_produtoModel->activo &&
                $this->_produtoModel->categoria->activo) {
            $this->view->produto = $this->_produtoModel->getRow();
            $produtoId = $this->_produtoModel->id;
            $fichaId = $this->_produtoModel->ficha_id;

            // menu
            $menu = new Goweb_Js_JSCookMenu('categorias');

            // categorias
            $this->_categoriaModel->where($this->_categoriaModel->getTableName() . '.activo=?', '1');
            $this->_categoriaModel->loadForeigns(false);
            $this->_categoriaModel->order('ordem');
            $categoriasRowset = $this->_categoriaModel->fetchAll();
            $categorias = null;
            if ($categoriasRowset) {
                foreach ($categoriasRowset as $row) {
                    $menu->addNode($row->id,
                    $row->pai_id,
                    $row->titulo,
                                   '',
                    Goweb::link('/catalogo/list/categoria_id/' . $row->id . '/'));
                }
                $categoriasList = $menu->build(0);
            }
            $this->view->categorias_list = $categoriasList;
			$this->view->categorianome = "";
			if ($this->_validateId($this->_produtoModel->categoria_id) && $this->_categoriaModel->find($this->_produtoModel->categoria_id) && $this->_categoriaModel->activo) {
				$categoria = $this->_categoriaModel->getRow();
				$this->view->categorianome = $categoria->titulo;
			}

			$this->view->categoria_id = $this->_produtoModel->categoria_id;
			
            // parametro para associar loja
            $this->view->loja = $this->_moduleConfig->loja->activa;

            // imagens
            $imagemModel = Goweb::getModelInstance('Catalogo_Model_Imagem', 'db', false);
            $imagemModel->where('produto_id=?', $produtoId);
            $this->view->imagens = $imagemModel->fetchAll();

            // ficheiros
            $ficheiroModel = Goweb::getModelInstance('Catalogo_Model_Ficheiro', 'db', false);
            $ficheiroModel->where('produto_id=?', $produtoId);
            $this->view->ficheiros = $ficheiroModel->fetchAll();

            // ficha
            $ficha = null;
            if ($fichaId > 0) {
                $ficha = $this->_getFicha($produtoId, $fichaId);
            }
            $this->view->ficha = $ficha;

			// elaboração do menu
		$categoriaModel = Goweb::getModelInstance('Catalogo_Model_Categoria', 'db', false);
		$db = $categoriaModel->getAdapter();
		$table = $categoriaModel->getTableName();

		$query = 'SELECT id, pai_id, titulo FROM ' . $table . ' WHERE activo = 1 ';
		$query .= ' order by ordem, titulo';
		if(($result = $this->_customCache->load(md5($query))) === false) {
			$result = $db->fetchAll($query);
			$this->_customCache->save($result, md5($query));
		}

		foreach($result as &$categoria)
		{
			$produtoModel = Goweb::getModelInstance('Catalogo_Model_produto', 'db', false);
			$db = $produtoModel->getAdapter();
			$table = $produtoModel->getTableName();

			$query = 'SELECT id FROM ' . $table . ' WHERE activo = 1 ';
			$query .= ' AND categoria_id = ' . $categoria['id'];
			$query .= ' limit 1';
					
			if(($produtos = $this->_customCache->load(md5($query))) === false) {
				$produtos = $db->fetchAll($query);
				$this->_customCache->save($produtos, md5($query));
			}
			if($produtos)
				$categoria['produtos'] = 1;
			else
				$categoria['produtos'] = 0;
		}
		
		$this->view->menu = $this->buildMenuAction($result, 0);

            if ($this->_directRequest) { // significa que foi chamado directamente.
                Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
                Cms_Controller::renderOutput($this->view,
                                             'detail.tpl',
                                             'Catalogo',
                                             'catalogo-detail',
                translate('Produtos'),
                $this->_getParam('print'));
                if (!$this->_getParam('print'))
                $this->_helper->viewRenderer->setRender('base-catalogo2');
            }
        } else {
            $this->view->setViewsPath(VIEWS_PATH);
            $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
            $this->_helper->viewRenderer->setRender('404');
        }
    }
	
	/**
     * Listagem dos Produtos
     */
    public function listProdutosDestaquesAction() {
        $page = $this->_request->page > 0 ? $this->_request->page : '1';

        // menu
        $menu = new Goweb_Js_JSCookMenu('categorias');

        // categoria_id
        $categoriaId = $this->_getParam('categoria_id');
		
        $rows = $this->_getParam('rows');
        $this->view->rows='';
        if ($this->_validateId($rows)) {
            $this->view->rows = '/rows/' . $rows;
        }
        if ($this->_validateId($categoriaId) && $this->_categoriaModel->find($categoriaId) && $this->_categoriaModel->activo) {
            $categoria = $this->_categoriaModel->getRow();
        } else {
            $categoria = null;
            $categoriaId = 0;
        }

        $this->view->categoria_id = $categoriaId;

        // paginator
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.destaque=?', '1');
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.activo=?', '1');
        $paginator = new Goweb_Paginator(Goweb::link('/catalogo/listProdutosDestaques/categoria_id/1/'. $this->view->rows . '/', 'page='),
        $this->_produtoModel->count(),
        $page,
        $rows ? $rows : $this->_moduleConfig->paginator->rows_per_page,
        $this->_moduleConfig->paginator->links_per_page);

        $this->view->paginator = $paginator;
        $this->view->setViewsPath(GENERIC_VIEWS_PATH);
        $this->view->paginator_output = $this->view->render('paginator.tpl');

        $this->view->setViewsPath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'Catalogo');

        // parametro para associar loja
        $this->view->loja = $this->_moduleConfig->loja->activa;

        // categorias
        $this->_categoriaModel->where($this->_categoriaModel->getTableName() . '.activo=?', '1');
        $this->_categoriaModel->loadForeigns(false);
        $this->_categoriaModel->order('ordem');
        $categoriasRowset = $this->_categoriaModel->fetchAll();
        $categorias = null;
        $categoriasList = array();
        if ($categoriasRowset) {
            foreach ($categoriasRowset as $row) {
                $menu->addNode($row->id,
                $row->pai_id,
                $row->titulo,
                               '',
                Goweb::link('/catalogo/listProdutosDestaques/categoria_id/1/' . $row->id . $this->view->rows .'/'));
            }
            $categoriasList = $menu->build(0);
        }
        $this->view->categorias_list = $categoriasList;

        // produtos
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.destaque=?', '1');
        $this->_produtoModel->where($this->_produtoModel->getTableName() . '.activo=?', '1');
        $this->_produtoModel->order('ordem');
        $this->_produtoModel->limitPage($paginator->getPage(), $paginator->getRowsPerPage());
        $produtos = $this->_produtoModel->fetchAll();
		$this->view->produtos = $produtos;
        $this->view->detail_url = '/catalogo/detail/id/';

		// breadcrumb
        //$titulo = $this->_caminho('0', $categoriaId);

		// elaboração do menu
		$categoriaModel = Goweb::getModelInstance('Catalogo_Model_Categoria', 'db', false);
		$db = $categoriaModel->getAdapter();
		$table = $categoriaModel->getTableName();

		$query = 'SELECT id, pai_id, titulo FROM ' . $table . ' WHERE activo = 1 ';
		$query .= ' order by ordem, titulo';
		if(($result = $this->_customCache->load(md5($query))) === false) {
			$result = $db->fetchAll($query);
			$this->_customCache->save($result, md5($query));
		}

		foreach($result as &$categoria)
		{
			$produtoModel = Goweb::getModelInstance('Catalogo_Model_produto', 'db', false);
			$db = $produtoModel->getAdapter();
			$table = $produtoModel->getTableName();

			$query = 'SELECT id FROM ' . $table . ' WHERE activo = 1 ';
			$query .= ' AND categoria_id = ' . $categoria['id'];
			$query .= ' limit 1';
					
			if(($produtos = $this->_customCache->load(md5($query))) === false) {
				$produtos = $db->fetchAll($query);
				$this->_customCache->save($produtos, md5($query));
			}
			if($produtos)
				$categoria['produtos'] = 1;
			else
				$categoria['produtos'] = 0;
		}
		
		$this->view->menu = $this->buildMenuAction($result, 0);
		

        // cms
        if ($this->_directRequest) { // significa que foi chamado directamente.
            Goweb::loadClass('Cms_Controller', APPLICATION_PATH);
            Cms_Controller::renderOutput($this->view,
                                        'list.tpl',
                                        'Catalogo',
                                        'catalogo-list',
            translate('PRODUTOS'),
            $this->_getParam('print'));
            $this->_helper->viewRenderer->setRender('base-catalogo2');
        } else {
            $this->_helper->viewRenderer->setRender('list');
        }
    }
	
	protected function buildMenuAction($categorias, $parent = null, $level = 0)
	{
		$session = Goweb::registry('session');
		$str = '<ul class="accordion">';

		foreach($categorias as $index => $categoria)
		{
			if($categoria['pai_id'] == $parent)
			{
				if ($categoria['produtos'])
					$str.= "<li><div id=\"cat".$categoria['id']."\"  class=\"level".$level."\" onclick=\"window.location.href = '/".$session->lang."/catalogo/listProdutos/categoria_id/".$categoria['id']."';\">".$categoria['titulo']."</div>";
				else
					$str .= "<li><div id=\"cat".$categoria['id']."\" class=\"level" . $level . "\">" . $categoria['titulo'] . "</div>";
				$sub = $this->buildmenuAction($categorias, $categoria['id'], $level+1);
				if($sub != '<ul class="accordion"></ul>')
					$str .= $sub;
				$str .= '</li>';
			}
		}
		return $str . '</ul>';
	}
}