<?php

abstract class Agro_Db_Table_Row_Abstract extends Zend_Db_Table_Row_Abstract {
	public $_user = null;
	
	public function getIterator(){
		return new ArrayIterator((array) $this->_data);
	}	
	
	public function getUsuarioLogado($field='') {
		$User = Zend_Auth::getInstance()->getIdentity();
		if ($field) {
			return $User->{$field};
		}
		
		return $User;
	}
	
	public function auditoria() {
		if ($this->id_usuario_criacao) {
			$Criacao = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow("select * from sistema.usuarios where id = {$this->id_usuario_criacao}");
			
			if ($this->id_usuario_alteracao) {
				$Alteracao = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow("select * from sistema.usuarios where id = {$this->id_usuario_alteracao}");
			}
		} else {
			throw new Exception("Nenhuma usuário de criação");
		}  
		
		$return = array();
		$return['dt_criacao'] = Agro_Util::formatDate($this->dt_criacao, Zend_Date::DATETIME);
		$return['dt_alteracao'] = Agro_Util::formatDate($this->dt_alteracao, Zend_Date::DATETIME);
		$return['usuario_alteracao'] = null;
		$return['usuario_criacao'] = null;
		$return['usuario_alteracao_login'] = $Alteracao['ds_nome_usuario'];
		$return['usuario_criacao_login'] = $Criacao['ds_nome_usuario'];
		
		switch ($Criacao['tp_usuario']) {
			case 'V':
			case 'F':
				$return['usuario_criacao'] = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select ds_nome_funcionario from sistema.funcionarios where id_usuario = {$this->id_usuario_criacao}");
				if ($this->id_usuario_alteracao) {
					$return['usuario_alteracao'] = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select ds_nome_funcionario from sistema.funcionarios where id_usuario = {$this->id_usuario_alteracao}");
				}
				break;
			case 'C':
				$return['usuario_criacao'] = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select ds_nome_fantasia from sistema.corretores where id_usuario = {$this->id_usuario_criacao}");
				if ($this->id_usuario_alteracao) {
					$return['usuario_alteracao'] = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select ds_nome_fantasia from sistema.corretores where id_usuario = {$this->id_usuario_alteracao}");
				}
				break;
			case 'P':
				$return['usuario_criacao'] = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select ds_nome_preposto from sistema.prepostos where id_usuario = {$this->id_usuario_criacao}");
				if ($this->id_usuario_alteracao) {
					$return['usuario_alteracao'] = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select ds_nome_preposto from sistema.prepostos where id_usuario = {$this->id_usuario_alteracao}");
				}
				break;
			default:
				$return['usuario_alteracao'] = $Alteracao['ds_nome_usuario'];
				$return['usuario_criacao'] = $Criacao['ds_nome_usuario'];
				break;
		}
		
		return $return;
	}
	
	public function status($field=false) {
		$row = $this->toArray();
		
		if (array_key_exists('id_status', $row)) {
			$Select = $this->select()->setIntegrityCheck(false)->from('sistema.status')->where('id = ?', $row['id_status']);
			$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
			
			if ($field) {
				return $Row[$field];
			} else {
				return $Row;
			}
		}
	}
	
	public function getStatus($chave, $grupo=false) {
		if ($grupo) {
			$Select = $this->select()->setIntegrityCheck(false)->from('sistema.status', 'id')->join('sistema.tipo_status', 'status.id_tipo_status = tipo_status.id', false)->where('status.ds_chave = ?', $chave)->where('tipo_status.ds_chave = ?', $grupo);
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		} else {
			$Select = $this->select()->setIntegrityCheck(false)->from('sistema.status', 'id')->where('ds_chave = ?', $chave);
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
	}
	
	/**
	 * Duplica registro e retorna o ID
	 * @author Vinicius Berni
	 * @since 21/10/2011
	 */
	public function duplicar($values=array(),$debug=false) {
		$tableClass = $this->getTableClass();
		$Model = new $tableClass();

		$metadata = $Model->getMetadata();
		
		$info = $Model->info();
		$whereList = array();
		$numberTerms = 0;
		$keyNames = array_values((array) $info['primary']);
		
		$whereClause = null;
        if ($keyNames) {
            $tableName = $Model->getAdapter()->quoteTableAs($info['name'], null, true);
            $whereAndTerms = array();
            
            foreach ($keyNames as $keyName) {
				$type = $info['metadata'][$keyName]['DATA_TYPE'];
				$columnName = $Model->getAdapter()->quoteIdentifier($keyName, true);
				$whereAndTerms[] = $Model->getAdapter()->quoteInto($info['name'] . '.' . $columnName . ' = ?', $this->{$keyName}, $type);
                $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')';
            }
            $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')';
        }
        
		$Row = $Model->fetchAll($whereClause)->current();
		$tmp = $Row->toArray();
		
		foreach ($tmp as $column => $value) {
			if ($metadata[$column]['PRIMARY']) { unset($tmp[$column]); }
			if (array_key_exists($column, $values)) { $tmp[$column] = ($values[$column] ? $values[$column] : $tmp[$column]); }
			
			switch ($metadata[$column]['DATA_TYPE']) {
				case 'bool':
					$tmp[$column] = ($tmp[$column] ? 1 : 0);
					break;
			}
			
			
		}
		
		$NewRow = $Model->createRow($tmp);
		$NewRow->save();
		
		return $NewRow;
	}
}