<?php

class Agro_Plugin_Regras extends Agro_Plugin_Dao_Regras {
	private $_propriedade = null;
	private $_proposta = null;
	
	public function __construct($Proposta) {
		
		// Seta a Propriedade
		$this->_propriedade = $Proposta->propriedade();
		
		// Seta a Proposta
		$this->_proposta = $Proposta;
		
	}
	
	/**
	 * Funcao que executa as regras nas unidades seguradas 01
	 * 
	 * @param array $dados
	 */
	public function RN_IS_01(array &$dados) {
		$tmp = $dados;
		
		if (is_array($this->_proposta->segurado['questionario'])) {
			if ($this->_proposta->respostas('QUEST_PRODUTIVIDADE_DECLARADA') == 1) {
				foreach ($tmp as $index => $item) {
					switch ($item['ds_chave_rn']) {
						case 'IS_PRODUCAO_PLANTA':
						case 'IS_NRO_PLANTAS':
							unset($dados[$index]);
							break;
						default:
							continue;
					}
				}
			} else if (array_key_exists('QUEST_PRODUTIVIDADE_DECLARADA', $this->_proposta->segurado['questionario']) && ($this->_proposta->segurado['questionario']['QUEST_PRODUTIVIDADE_DECLARADA'] == 2)) {
				foreach ($tmp as $index => $item) {
					if ($item['ds_chave_rn'] == 'IS_AREA' || $item['ds_chave_rn'] == 'IS_PRODUTIVIDADE') {
						$dados[$index]['attrib']['disabled'] = true;
					}
				}
			}
		}
	}
	
	/**
	 * Funcao que executa as regras nas unidades seguradas 02
	 * 
	 * @param array $dados
	 * @param array $propriedades
	 */
	public function RN_IS_02(array &$dados, array $propriedades) {
		$validacoes = $this->validacoes($this->_proposta->id_produto);
		$dados['IS_STATUS'] = true;
		
		if ($propriedades['PROD_PRODUCAO_GARANTIDA']) {
			$dados = $this->RN_IS_03($dados, $propriedades);
			$dados['IS_LMGA_PARCIAL'] = Agro_Util::formatDbCurrency(Agro_Util::round($dados['IS_PRODUCAO_GARANTIDA'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) * $dados['IS_AREA'], 2));
		} else {
			$dados['IS_LMGA_PARCIAL'] = Agro_Util::formatDbCurrency(round($dados['IS_AREA'],2) * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) * $dados['IS_PRODUTIVIDADE']);
		}
		
		if ($dados['IS_VALOR_TONELADA'] > 0) {
			// Verifica se existe a propriedade limite minimo e maximo para o valor/tonelada
			if ((array_key_exists('LIMITE_MINIMO_IS', $propriedades)) && (array_key_exists('LIMITE_MAXIMO_IS', $propriedades))) {
				$valor = Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']);
				$minimo = Agro_Util::formatCurrencyDb($propriedades['LIMITE_MINIMO_IS']);
				$maximo = Agro_Util::formatCurrencyDb($propriedades['LIMITE_MAXIMO_IS']);
				
				if (($valor < $minimo) || ($valor > $maximo)) {
					$dados['IS_MESSAGE'] = "O Valor (R$/ton) ".Agro_Util::formatDbCurrency($valor)." não está entre ".Agro_Util::formatDbCurrency($minimo)." e ".Agro_Util::formatDbCurrency($maximo);
					$dados['IS_LMGA_PARCIAL'] = 0;
					$dados['IS_STATUS'] = false;
					return false;
				}
			}
		}
		
		//!Agro_Util::checkPermission('seguro:regras:naovalidar') &&
		if (count($validacoes)) {
			foreach ($validacoes as $validacao) {
				
				/*
				 * Aplica a validacao de VALIDACAO_ZONEAMENTO
				 */
				if ($validacao['ds_chave'] == 'VALIDACAO_ZONEAMENTO') {
					$dados['IS_CICLO_VARIEDADE'] = $this->ciclo($this->_proposta->id_produto, $dados['IS_VARIEDADES'], $this->_propriedade['id_estado']);
					if (!$dados['IS_CICLO_VARIEDADE']) {
						$dados['IS_MESSAGE'] = "Não há ciclo especificado para a variedade selecionada.";
						$dados['IS_LMGA_PARCIAL'] = 0;
						$dados['IS_STATUS'] = false;
						return false;
					}
				}
				
				if (($dados['IS_PRODUTIVIDADE']) > 0 && (Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']) > 0)) {
					/*
					 * Aplica a validacao de VALIDACAO_IS_PRODUCAO_MINIMA_MACA
					 */					
					if ($validacao['ds_chave'] == 'VALIDACAO_IS_PRODUCAO_MINIMA_MACA') {
						if (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $dados)) {
							$Densidade = (10000 / ($dados['IS_ESPACAMENTO_COMPOSTO']['n'] * $dados['IS_ESPACAMENTO_COMPOSTO']['m']));
						} elseif (array_key_exists('IS_ESPACAMENTO_SIMPLES', $dados)) {
							$espacamento = explode('x', $dados['IS_ESPACAMENTO_SIMPLES']);
							$Densidade = (10000 / ($espacamento[0] * $espacamento[1]));
						}			
		
						// Busca o Grupo da variedade
						$idGrupoVariedade = $this->grupo_variedade($dados['IS_VARIEDADES'], $Validacao['id']);
						if (!$idGrupoVariedade) {
							$dados['IS_MESSAGE'] = "Não foi possível encontrar o grupo da Variedade.";
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						}
						
						// Busca o Grupo do porta enxerto
						$idGrupoPortaenxerto = $this->grupo_porta_enxerto($dados['IS_PORTAENXERTO']);
						if (!$idGrupoPortaenxerto) {
							$dados['IS_MESSAGE'] = "Não foi possível encontrar o grupo do Porta Enxerto.";
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						} else {
							// Busca o grupo da densidade
							if (!$this->grupo_densidade($Densidade, $idGrupoPortaenxerto)) {
								$dados['IS_MESSAGE'] = "Não foi possível encontrar o grupo da densidade.";
								$dados['IS_LMGA_PARCIAL'] = 0;
								$dados['IS_STATUS'] = false;
								return false;
							}
						}
						
						// Busca os valores 
						$valores = $this->valores_validacao($idGrupoVariedade, $idGrupoPortaenxerto, $idValidacaoGrupoDensidade, $dados['IS_IDADE'], $Validacao->id);
						if ($valores['nr_plantas'] or $valores['nr_plantas_regiao']) {
							if ($this->_proposta->id_municipio == 4535 or $this->_proposta->id_municipio == 4394 or $this->_proposta->id_municipio == 4602) {
								$dados['IS_PRODUCAO_MINIMA'] = $valores['nr_plantas_regiao'];
							} else {
								$dados['IS_PRODUCAO_MINIMA'] = $valores['nr_plantas'];
							}
						} else {
							$dados['IS_MESSAGE'] = "Não foi possível encontrar o valor da produção mínima.";
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						}
					}
					
					/*
					 * Aplica a validacao de VALIDACAO_PE_DENSIDADE_VAR
					 */
					if ($validacao['ds_chave'] == 'VALIDACAO_PE_DENSIDADE_VAR') {
						// Calcula a densidade baseado no espacamento
						if (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $dados)) {
							$Densidade = (10000 / ($dados['IS_ESPACAMENTO_COMPOSTO']['n'] * $dados['IS_ESPACAMENTO_COMPOSTO']['m']));
						} elseif (array_key_exists('IS_ESPACAMENTO_SIMPLES', $dados)) {
							$espacamento = explode('x', $dados['IS_ESPACAMENTO_SIMPLES']);
							$Densidade = (10000 / ($espacamento[0] * $espacamento[1]));
						}
						
						// Busca o Grupo da variedade
						$idGrupoVariedade = $this->grupo_variedade($dados['IS_VARIEDADES'], $validacao['id']);
						if (!$idGrupoVariedade) {
							$dados['IS_MESSAGE'] = "Não foi possível encontrar o grupo da Variedade.";
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						}
						
						// Busca o Grupo do porta enxerto
						$idGrupoPortaenxerto = $this->grupo_porta_enxerto($dados['IS_PORTAENXERTO']);
						if (!$idGrupoPortaenxerto) {
							$dados['IS_MESSAGE'] = "Não foi possível encontrar o grupo do Porta Enxerto.";
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						}
						
						// Busca o grupo da densidade
						$idValidacaoGrupoDensidade = $this->grupo_densidade($Densidade, $idGrupoPortaenxerto);
						if (!$idValidacaoGrupoDensidade) {
							$dados['IS_MESSAGE'] = "Não foi possível encontrar o grupo da densidade.";
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						}
						
						// Busca os valores 
						$valores = $this->valores_validacao($idGrupoVariedade, $idGrupoPortaenxerto, $idValidacaoGrupoDensidade, $dados['IS_IDADE'], $Validacao->id);
						$valor = $dados['IS_PRODUTIVIDADE'] * Agro_Util::formatCurrencyDb($dados['IS_VALOR_TONELADA']);
						if ($dados['IS_IDADE'] == 1 or $dados['IS_IDADE'] == 2) {
							$valores['vl_minimo'] = 0;
						}						
						
						if (($valor < $valores['vl_minimo']) || ($valor > $valores['vl_maximo'])) {
							$valor = Agro_Util::formatCurrencyDb($valor);
							$min = Agro_Util::formatCurrencyDb($valores['vl_minimo']);
							$max = Agro_Util::formatCurrencyDb($valores['vl_maximo']);
							
							$dados['IS_MESSAGE'] = "O Valor (".Agro_Util::formatDbCurrency($valor).") da LMGA por hectare não está entre ".Agro_Util::formatDbCurrency($min)." e ".Agro_Util::formatDbCurrency($max);
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						}
					}
					
					/*
					 * Aplica a validacao de VALIDACAO_VARIEDADE_LIMITE
					 */
					if ($validacao['ds_chave'] == 'VALIDACAO_VARIEDADE_LIMITE') {
						$between = $this->checkBetweenVariedade($dados, $this->_proposta->id_produto);
						if (is_array($between)) {
							$valor = Agro_Util::formatCurrencyDb($between[2]);
							$min = Agro_Util::formatCurrencyDb($between[0]);
							$max = Agro_Util::formatCurrencyDb($between[1]);
							
							$dados['IS_MESSAGE'] = "O Valor (".Agro_Util::formatDbCurrency($valor).") da LMGA por hectare (ha) não está entre ".Agro_Util::formatDbCurrency($min)." e ".Agro_Util::formatDbCurrency($max);
							$dados['IS_LMGA_PARCIAL'] = 0;
							$dados['IS_STATUS'] = false;
							return false;
						}
					}
					
					/*
					 * Aplica a validacao de VALIDACAO_VARIEDADE_IDADE
					 */
					if ($validacao['ds_chave'] == 'VALIDACAO_VARIEDADE_IDADE') {
					}
				}
			}
		}
	}
	
	/**
	 * Executa a regra 3 para as unidades seguradas
	 * 
	 * @param array $dados
	 * @param array $propriedades
	 * @param float $franquia
	 */
	public function RN_IS_03($dados, $propriedades) {
		$franquia = $this->_proposta->franquia_cobertura_principal();
		
		if ($franquia > 0) {
			$dados['IS_PRODUCAO_GARANTIDA'] = Agro_Util::round((($franquia * $dados['IS_PRODUTIVIDADE'])/100), 3);			
		} else {
			$taxa = $Proposta->taxas($this->_proposta->agrupamento(), $propriedades['PROD_PRODUCAO_GARANTIDA']);
			$franquia = $taxa[0]['vl_franquia'];
			$dados['IS_PRODUCAO_GARANTIDA'] = Agro_Util::round((($franquia * $dados['IS_PRODUTIVIDADE'])/100), 3);
		}
		
		return $dados;
	}
	
	/**
	 * Executa a regra 4 para as unidades seguradas
	 * 
	 * @param array $dados
	 * @param array $propriedades
	 * @param float $franquia
	 */
	public function RN_IS_04(&$dados) {
		if (!array_key_exists('IS_NRO_PLANTAS', $dados)) {
			$dados['IS_MESSAGE'] = "Não foi informado o número de plantas.";
			$dados['IS_STATUS'] = false;
			return false;
		}
		
		if (!array_key_exists('IS_PRODUCAO_PLANTA', $dados)) {
			$dados['IS_MESSAGE'] = "Não foi informado a produção por plantas.";
			$dados['IS_STATUS'] = false;
			return false;
		}
		
		if (array_key_exists('IS_ESPACAMENTO_SIMPLES', $dados)) {
			$espacamento = $dados['IS_ESPACAMENTO_SIMPLES'];
		} else if (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $dados)) {
			$espacamento = ($dados['IS_ESPACAMENTO_COMPOSTO']['n'] * $dados['IS_ESPACAMENTO_COMPOSTO']['m']);
		}
		
		$dados['IS_AREA'] = ($dados['IS_NRO_PLANTAS'] / (10000 / $espacamento));
		$dados['IS_PRODUTIVIDADE'] = round(((10000 / $espacamento) * ($dados['IS_PRODUCAO_PLANTA'] / 1000)),3);
	}
	
	public function RN_IS_05(&$dados) {
		$cobertura = $this->cobertura('COB_PROTECAO_FITO', $this->_proposta->id_produto);
		
		if ($cobertura) {
			if ($dados['IS_LMGA_PARCIAL'] > 0) {
				$dados['IS_LMI_POS_GRANIZO'] = ($dados['IS_LMGA_PARCIAL'] * 100);
			} else if ($dados['IS_LMGA_PARCIAL'] == 0) {
				$dados['IS_LMI_POS_GRANIZO'] = 0;
			}
		}
	}
}