<?php

/**
 * Goweb Sitemanager 5 Framework
 * 
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Db
 * @subpackage Model
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */

/**
 * Classe abstracta que representa uma coluna numa tabela.
 *
 * @version    5.0.0
 * @category   Goweb
 * @package    Goweb_Db
 * @subpackage Model
 * @author     I&D <dev@goweb.pt>, Pedro Pinto <ppinto@goweb.pt>
 * @copyright  2009 (c) Goweb (http://www.goweb.pt)
 */
abstract class Goweb_Db_Model_Col {

    /**
     * Paremetros de configuracao da coluna
     *
     * Paremetros comuns a todos os tipo de colunas:
     * <code>
     * name      => (string) Nome da coluna<br />
     * type      => (string) Tipo de coluna<br />
     * notnull   => (bool) N&atilde;o nulo (<b>false</b>)<br />
     * primary   => (bool) Se e chave primeria(<b>false</b>)<br />
     * default   => (string) Metodo a ser executado se o valor for null<br />
     * on_insert => (string) Metodo a ser executado quando for efectuado um insert<br />
     * on_update => (string) Metodo a ser execurado quando for efectuado um update<br />
     * show      => (bool) Flag para a coluna ser mostrada no formul&aacute;rio<br />
     * unique    => (bool) Flag para o valor da coluna ser enico na tabela<br />
     * </code>
     *
     * @var  array
     */
    protected $_params =  array('name'      => '',
                                'type'      => '',
                                'notnull'   => false,                                
                                'label'     => '',
                                'help'      => null,
                                'primary'   => false,
                                'readonly'  => false,
                                'default'   => null,
                                'on_insert' => null,
                                'on_update' => null,
                                'show'      => true,
                                'unique'    => false);

    /**
     * Constructor
     */
    public function __construct($params) {
        if ((isset($params['on_insert']) && $params['on_insert']) || (isset($params['on_update']) && $params['on_update'])) $this->_params['show'] = false;
        foreach ($params as $key => $value) {
            if (!array_key_exists($key, $this->_params)) {
                throw new Goweb_Exception('O paremetro "' . $key .'" n&atilde;o existe no tipo de coluna ' . get_class($this));
            }
            $this->_params[$key] = $value;
        }
    }
    
    /**
     * Retorna o tipo de coluna.
     * 
     * @return  string  Tipo de coluna
     */
    public final function getType() {
        return $this->_params['type'];
    }
    
    /**
     * Retorna o array com os paremetros de configuracao.
     *
     * @return  array  Os paremetros de configuracao
     */
    public final function getParams() {
        return $this->_params;
    }
    
    /**
     * Retorna um paremetro de configuracao
     *
     * @param   string  $param   Nome do paremetro
     * @throws  Goweb_Exception  Caso o paremetro n&atilde;o existir
     * @return  string  O valor do paremetro de configuracao
     */
    public final function getParam($param) {
        if (!array_key_exists($param, $this->_params)) {
            throw new Goweb_Exception('O paremetro "' . $param .'" n&atilde;o existe no tipo de coluna ' . get_class($this));
        }
        return $this->_params[$param];
    }
    
    /**
     * Atribui um valor a um paremetro de configuracao
     *
     * @param   string  $param   Nome do paremetro
     * @param   string  $value   Valor a atribuir ao paremetro
     * @throws  Goweb_Exception  Caso o paremetro n&atilde;o existir
     */    
    public function setParam($param, $value) {
        if (!array_key_exists($param, $this->_params)) {
            throw new Goweb_Exception('O paremetro "' . $param .'" n&atilde;o existe no tipo de coluna ' . get_class($this));
        }
        $this->_params[$param] = $value;
    }        
}
