<?php

class Agro_Plugin_Dao_Regras {
	
	/**
	 * Busca as validações que o produto tem
	 * 
	 * @param integer $idProduto
	 */
	public function validacoes($idProduto) {
		$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$Select->from(array('pv' => 'produto.produtos_validacoes'), null);
		$Select->join(array('v' => 'produto.validacoes'), 'pv.id_validacao = v.id', array('id', 'ds_chave'));
		$Select->where('pv.id_produto = ?', $idProduto);
		
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}
	
	/**
	 * Busca o ciclo
	 * 
	 * @param integer $idProduto
	 * @param integer $idVariedade
	 * @param integer $idEstado
	 */
	public function ciclo($idProduto, $idVariedade, $idEstado) {
		if ($idProduto && $idVariedade && $idEstado) {
			$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
			$Select->from('produto.variedades_ciclos_estados', 'id_ciclo');
			$Select->where('id_produto = ?', $idProduto);
			$Select->where('id_variedade = ?', $idVariedade);
			$Select->where('id_estado = ?', $idEstado);
			
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		} else {
			return false;
		}
	}
	
	/**
	 * Busca o grupo da variedade
	 * 
	 * @param integer $idVariedade
	 * @param integer $idValidacao
	 */
	public function grupo_variedade($idVariedade, $idValidacao) {
		if ($idVariedade && $idValidacao) {
			$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
			$Select->from(array('vgvv'=>'produto.validacoes_grupo_variedade_variedades'), 'id_grupo_variedade');
			$Select->join(array('vgv' => 'produto.validacoes_grupo_variedade'), 'vgvv.id_grupo_variedade = vgv.id', null);
			$Select->where('vgvv.id_variedade = ?', $idVariedade);
			$Select->where('vgv.id_validacao = ?', $idValidacao);
			
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
	}
	
	/**
	 * Busca o grupo de porta enxerto
	 * 
	 * @param integer $idPortaenxerto
	 */
	public function grupo_porta_enxerto($idPortaenxerto) {
		if ($idPortaenxerto) {
			$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
			$Select->from(array('vgpp'=>'produto.validacoes_grupo_portaenxerto_portaenxertos'), 'id_grupo_portaenxerto');
			$Select->join(array('vgp' => 'produto.validacoes_grupo_portaenxerto'), 'vgpp.id_grupo_portaenxerto = vgp.id', null);
			$Select->where('vgpp.id_portaenxerto = ?', $idPortaenxerto);
			
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
	}
	
	/**
	 * Busca o grupo da densidade
	 * 
	 * @param integer $densidade
	 * @param integer $portaenxerto
	 */
	public function grupo_densidade($densidade, $portaenxerto) {
		$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$Select->from(array('vgd' => 'produto.validacoes_grupo_densidade'), 'id');
		$Select->where('id_grupo_portaenxerto = ?', $portaenxerto);
		$Select->where('? between vl_densidade_minima and vl_densidade_maxima', $densidade);
		
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}
	
	/**
	 * Busca os valores das validacoes
	 * 
	 * @param integer $variedade
	 * @param integer $portaenxerto
	 * @param integer $densidade
	 * @param integer $idade
	 * @param integer $validacao
	 */
	public function valores_validacao($variedade, $portaenxerto, $densidade, $idade, $validacao) {
		if ($variedade && $portaenxerto && $densidade && $validacao) {
			$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
			$Select->from(array('vgd' => 'produto.validacoes_is_valores'));
			$Select->where('id_grupo_portaenxerto = ?', $portaenxerto);
			$Select->where('id_grupo_densidade = ?', $densidade);
			$Select->where('id_grupo_variedade = ?', $variedade);
			$Select->where('id_validacao = ?', $validacao);
			$Select->order('nu_idade');
			
			$item = false;
			$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
			
			
			if (Agro_Util::exists_in_recordset($idade, 'nu_idade', $Rs)) {
				if (count($Rs)) {
					foreach ($Rs as $Row) {
						$item = array(
							'vl_minimo' => $Row['vl_minimo'],
							'vl_maximo' => $Row['vl_maximo'],
							'nr_plantas' => $Row['nr_plantas'],
							'nr_plantas_regiao' => $Row['nr_plantas_regiao']
						);
						
						if ($idade == $Row['nu_idade']) {
							break;
						}
					}
				}
			} else {
				$primeiro = current($Rs);
				$ultimo = end($Rs);
				
				$difPrimeiro = abs($idade - $primeiro['nu_idade']); 
				$difUltimo = abs($idade - $ultimo['nu_idade']); 
	
				if ($difPrimeiro < $difUltimo) {
					$item = array(
						'vl_minimo' => $primeiro['vl_minimo'],
						'vl_maximo' => $primeiro['vl_maximo'],
						'nr_plantas' => $primeiro['nr_plantas'],
						'nr_plantas_regiao' => $primeiro['nr_plantas_regiao']
					);
				} elseif ($difPrimeiro > $difUltimo) {
					$item = array(
						'vl_minimo' => $ultimo['vl_minimo'],
						'vl_maximo' => $ultimo['vl_maximo'],
					    'nr_plantas' => $ultimo['nr_plantas'],
					    'nr_plantas_regiao' => $ultimo['nr_plantas_regiao']
					);
				}
			}
			
			return $item;
		}
	}
	
	/**
	 * Verifica se as datas das variedades estao corretas
	 * @param unknown_type $dados
	 * @param unknown_type $idProduto
	 */
	public function checkBetweenVariedade($dados, $id_produto) {
		if ($dados) {
			if ($dados['IS_LMGA_PARCIAL'] && $dados['IS_VARIEDADES']) {
				$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
				$Select->from(array('pv'=>'produto.produtos_variedades'), array('vl_importancia_segurada_minima', 'vl_importancia_segurada_maxima'));
				$Select->where('id_variedade = ?', $dados['IS_VARIEDADES']);
				$Select->where('id_produto = ?', $id_produto);
				$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
				
				if ($dados['IS_IDADE'] == 1 or $dados['IS_IDADE'] == 2) {
					$Row['vl_importancia_segurada_minima'] = 0;
				}
				
				$tmp = $dados['IS_PRODUTIVIDADE'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']);
				if ($tmp >= $Row['vl_importancia_segurada_minima'] && $tmp <= $Row['vl_importancia_segurada_maxima']) {
					return true;
				} else {
					return array($Row['vl_importancia_segurada_minima'], $Row['vl_importancia_segurada_maxima'], $tmp);
				}
			}
		} else {
			return false;
		}
	}
	
	/**
	 * Busca a cobertura
	 * 
	 * @param string $chave
	 * @param integer $produto
	 */
	public function cobertura($chave, $produto) {
		$Select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
		$Select->from(array('c'=>'produto.coberturas'), '*');
		$Select->join(array('pc'=>'produto.produtos_coberturas'), 'c.id = pc.id_cobertura');
		
		if ($chave) {
			$Select->where('ds_chave_cobertura = ?', $chave);
		}
		
		if ($produto) {
			$Select->where('pc.id_produto = ?', $produto);
		}
		
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
	}
	
}