<?php

Goweb::loadClass('Goweb_Db_Model_Category');

/**
 * Goweb Sitemanager 5 Framework
 * @version    5.0.19
 * @category   Frontoffice
 * @package    Catalogo
 * @subpackage Model
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
*/
class Catalogo_Model_Categoria extends Goweb_Db_Model_Category {
    
    /**
     * Nome da Tabela
     *
     * @var string
    */
    protected $_table = 'catalogo_categoria';
    
    /**
     * Chave Primaria
     * 
     * @var string
    */
    protected $_primary = 'id';
    
    /**
     * Campo que sera retornado se um
     * echo do objecto for chamado
     *
     * @var string
    */
    protected $_toString = 'titulo';
    
    
    /**
     * Metodo obrigatorio. Informa a definicao da tabela
     * referente ao Model em questao.
    */
    protected function _setup() {
        $config = new Goweb_Config(Goweb_Config_Ini::load(APPLICATION_PATH . DIRECTORY_SEPARATOR . 'Catalogo' . DIRECTORY_SEPARATOR . 'config.ini', 'base'));
        $this->initLang();
        $this->setSyncCols(array('ordem', 'imagem'));
        $this->pai_id      = $this->SelfKey(array('alias' => 'p', 'label' => translate('Categoria Pai'), 'default' => '0'));
        $this->ficha_id    = $this->ForeignKey(array('model' => 'Catalogo_Model_Ficha', 'alias' => 'ficha', 'label' => translate('Ficha dos Produto'), 'default' => '0'));
        $this->iva_id      = $this->ForeignKey(array('model' => 'Catalogo_Model_Iva', 'alias' => 'iva', 'label' => translate('I.V.A dos Produto'), 'default' => '0'));
        $this->ordem       = $this->Integer(array('default' => 0, 'label' => translate('Ordem')));
        $this->titulo      = $this->Char(array('maxlength' => 200, 'notnull' => true, 'label' => translate('T&iacute;tulo')));
        $this->url         = $this->Char(array('maxlength' => 200, 'label' => translate('Url Amig&aacute;vel'), 'on_update' => '_urlFromTitulo', 'show' => true));        
        $this->imagem      = $this->Image(array('target' => $config->images->target,
                                                'prefix' => $config->images->prefix,
                                                'original' => $config->images->original->save,
                                                'max_size' => $config->images->original->max_size,
                                                'max_width' => $config->images->original->max_width,
                                                'max_height' => $config->images->original->max_height,
                                                'type_resize' => $config->images->original->type_resize,
                                                'small_max_width' => $config->images->categoria->width,
                                                'small_max_height' => $config->images->categoria->height,
                                                'small_type_resize' => $config->images->categoria->type_resize));
        $this->activo      = $this->Boolean(array('default' => '1', 'label' => translate('Activo')));
        $this->actualizado = $this->Datetime(array('on_update' => '_currentDatetime', 'label' => translate('Actualizado em')));
        $this->criado      = $this->Datetime(array('on_insert' => '_currentDatetime', 'label' => translate('Criado em')));
        $this->ip          = $this->IpAddress(array('on_update' => '_remoteAddress', 'label' => translate('Endere&ccedil;o IP')));
        $this->hasMany('Catalogo_Model_Produto', 'categoria_id', 'produto');
    }

    /**
     * Obter um url amigável com base no titulo
     *
     * @return String com um url amigável
     */
    protected function _urlFromTitulo() {
        if ($this->url == '') {
            $this->url = $this->_clearString($this->titulo);
            $this->url = $this->_getParents($this->pai_id, $this->url);
        } else {
            $this->url = $this->_clearString($this->url);
        }
        $tmpModel = new Catalogo_Model_Categoria('db', false);
        $url = $this->url;
        $count = 0;
        while ($tmpModel->findBy('url', $url) && $tmpModel->id != $this->id){
            $count++;
            if ($count == 1) $url .= '-';
            $url=$this->url . $count;
        }
        $this->url = $url;
        return $this->url;
    }
    
    /**
     * Obter o url dos pais da categoria
     *
     * @param int $pai_id
     * @param string $parents
     * @return string
     */
    protected function _getParents($pai_id = 0, $parents = ''){
        $categoriaModel = new Catalogo_Model_Categoria('db', false);
        
        if ($categoriaModel->find($pai_id)){
            if (strlen($parents) > 0 && strlen($categoriaModel->url) > 0) $parents = "/" . $parents;
            $parents = $categoriaModel->url . $parents;
            while ($categoriaModel->find($categoriaModel->pai_id)){
                if ($categoriaModel->url && strpos($parents, $categoriaModel->url) === false){
                    if (strlen($parents) > 0 && strlen($categoriaModel->url) > 0) $parents = "/" . $parents;
                    $parents = $categoriaModel->url . $parents;
                }
            }
        }
        return $parents;
    }
}