<?php

class Seguro_ItensseguradosController extends Agro_Controller_Action
{
    public function deleteAction()
    {
        $params = $this->getRequest()->getParams();
        $this->isAjax();
        $parametrosRetorno = ['somente_quadras' => true, 'delete' => true];

        if ($params['id_proposta']) {
            $propostas = new Seguro_Model_Propostas();
            $proposta = $propostas->find($params['id_proposta'])->current();

            try {
                Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

                $modelItensSegurados = new Seguro_Model_ItensSegurados();
                $modelPropostasArquivos = new Seguro_Model_PropostasArquivos();

                $todasPropostas = $propostas->getTodasPropostas($params['id_proposta'])->toArray();
				
				$status_invalidos = array(160);
				//Filtro pra remover endossos com status "ENDOSSO_INCOMPLETO"
				foreach($todasPropostas as $indice => $valor){
					if(in_array($todasPropostas[$indice]['id_status'], $status_invalidos)){
						unset($todasPropostas[$indice]);
					}
				}
				
                if (count($todasPropostas) > 1) {
                    unset($todasPropostas[0]);

                    $itensSeguradosEndossoAtual = count(
                        $modelItensSegurados->fetchItensProposta($params['id_proposta'])
                    );
                    $itensSeguradosEndossoAnterior = count(
                        $modelItensSegurados->fetchItensProposta($todasPropostas[1]['id'])
                    );
                    $totalItensExcluir = count($params['deletar_unidades']);
					
                    if (($itensSeguradosEndossoAtual - $totalItensExcluir) < $itensSeguradosEndossoAnterior) {
                        $mensagem = "Exclusão não permitida, pois o número de itens do endosso atual não pode ser ";
                        $mensagem .= " menor que o número de itens do endosso anterior";
                        $mensagem .= " ({$itensSeguradosEndossoAnterior}).";

                        throw new Exception($mensagem, 1);
                    }
                }

                if (is_array($params['deletar_unidades'])) {
                    foreach ($params['deletar_unidades'] as $nrItem) {
                        if ($proposta->id && $nrItem) {
                            $modelItensSegurados->deleteunidade($proposta->id, $nrItem, true);
                        }
                    }

					if (!(new Seguro_Model_PropostasHashOrcamento())->save($params['id_proposta'])) {
						throw new Exception("Não foi possível criar a hash do orçamento.");
					}

                    Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
                }

                $itens = new Seguro_Model_ItensSegurados();
                $itens->reOrdena($params['id_proposta']);
            } catch (Exception $e) {
                Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();

                if ($e->getCode() === 1) {
                    $parametrosRetorno['mensagemErro'] = $e->getMessage();
                }
            }
        }

        $this->getResponse()->setBody(
            $this->view->unidades($proposta, $parametrosRetorno)
        );
    }

	/*
	* Verifica se não foram abertas duas propostas para edição/inclusão
	*/
    public function checaSessao($md)
    {
		$Session = new Zend_Session_Namespace('PROPOSTA');
		$User = Zend_Auth::getInstance()->getIdentity();

		if (($Session->id_proposta) && ($User->id_empresa <> 20))  {
			if ($md <> md5($Session->id_proposta.$_SERVER['SERVER_ADDR'])) {
				return false;
			}
		}
		return true;
	}


    public function saveAction()
    {
		$post = $this->getRequest()->getParams();
		$result = array('totalizadorArea' => 0, 'totalizadorLmga' => 0);
		$this->isAjax();
		
		$ItensSegurados = new Seguro_Model_ItensSegurados();
		$Propostas = new Seguro_Model_Propostas();

		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		try {
			if ($post['id_proposta']) {
				if (!$this->checaSessao($post['md'])) {
					$error = true;
					$result = array('status' => false, 'message' => "Prezado Corretor.\n\n Por motivo de segurança, não é permitido editar Orçamentos simultaneamente.\n Favor fechar esta janela e retornar a operação.");
				} else {
					$result['md'] = $post['md'];
				}

				// Carrega a Proposta
				$Proposta = $Propostas->find($post['id_proposta'])->current();
				$informacoesProposta = $Propostas->get($post['id_proposta'])->toArray();

				$Produto = $Proposta->produto();

				$configuracaoCarAtiva = (new Produto_Model_Atributogrupos())
					->isAtributoLiberadoParaProduto((int) $informacoesProposta['id_produto'], 'IS_CAR');

				$criteriosRestricoes = array(
					'idMunicipio'	=> $informacoesProposta['id_municipio'],
					'idProduto' 	=> $informacoesProposta['id_produto'],
					'idCobertura' 	=> $informacoesProposta['id_cobertura_principal'],
					'idCultura' 	=> $informacoesProposta['id_cultura'],
					'idSafra' 		=> $informacoesProposta['id_safra']
				);
				
				$modelValidacoes 			= new Produto_Model_ValidacoesRestricoes();
				$modelRestricoesCriterios 	= new Produto_Model_ValidacoesRestricoesCriterios();
	
				$restricoesSemCobertura		= $modelValidacoes->getRestricoesSemCobertura($criteriosRestricoes);
				Agro_Util::processarRestricoes($restricoesSemCobertura, $modelRestricoesCriterios);
			
				if ($Proposta->id_proposta_endossada) {
                    $PropostaEndossada = $Propostas->find($Proposta->id_proposta_endossada)->current();

                    if ($PropostaEndossada->count_itens_segurados() > count($post['unidades'])) {
                        throw new Exception('Número de Quadras/Talhões é inferior ao da proposta endossada!');
                    }
                }

				// Busca as propriedades da proposta
				$propriedades = $Proposta->propriedades();
                $erroParaAndamentoEndosso = false;

				// Verifica se foi passado unidades
				if ((is_array($post['unidades'])) && ($error == false)) {
					
					$validarLimiteIS = Agro_Regras::validarLimiteIS($Proposta->id_proposta_mae, $post['unidades']);
					if (!empty($validarLimiteIS['unidades'])) {
						$result['unidades'] = $validarLimiteIS['unidades'];
					}

					$isCarObrigatorio = Seguro_Service_Car::isCarObrigatorio($Proposta->id);

					// Percorre as unidades
					foreach ($post['unidades'] as $nro => $unidade) {

						//Novas validações
						if(!empty($restricoesSemCobertura)){
							$idProposta = ($Proposta->isEndosso()) ? $Proposta->toArray()['id_proposta_mae'] : $Proposta->id ;
							$resultadoValidacoes = $modelValidacoes->validar($restricoesSemCobertura, $unidade, $idProposta);
							
							if(!empty($resultadoValidacoes)){
								$result = array('status' => false, 'errosDeRestricao' => $resultadoValidacoes, 'md' => true);
								$this->getResponse()->setBody(Zend_Json::encode($result));
								continue;
							}
						}
						// Regras da Proposta
						$Regras = new Agro_Regras();

						// Valida limite de IS
						$error = false;
						if (!empty($result['unidades'][$nro])) {
							$Regras->error = $error = true;
							$Regras->message = $result['unidades'][$nro]['message'];
						}

						// Atribui o numero do item
						$unidade['nr_item_segurado'] = $nro;

						// Verifica producao garantida
						if ($Proposta->respostas('QUEST_PRODUTIVIDADE_DECLARADA') == 2 && !$error) {
							// Aplica Regra RN_IS_04
							$Regras->RN_IS_04($unidade);
							if ($Regras->error) {
								$result['unidades'][$nro] = array('status' => false, 'message' => $Regras->message);
								$error = $erroParaAndamentoEndosso = true;
							}
						}

						// Aplica Regra RN_IS_02
						if (!$error) {
							$Regras->RN_IS_02($unidade, $Proposta, $propriedades, $Proposta->versao_endosso(false));
							if ($Regras->error) {
								$result['unidades'][$nro] = array('status' => false, 'message' => $Regras->message);
								$error = $erroParaAndamentoEndosso = true;
							}
						}

						// Aplica Regra RN_IS_05
						if (!$error) {
							$Regras->RN_IS_05($unidade, $Proposta);
							if ($Regras->error) {
								$result['unidades'][$nro] = array('status' => false, 'message' => $Regras->message);
								$error = $erroParaAndamentoEndosso = true;
							}
						}
						
						$itemLocalizacaoSemCar = false;
						
						if (!$Regras->error) {
							if ($ItensSegurados->save($nro, $unidade, $Proposta->id)) {
								$result['unidades'][$nro] = array(
									'status' => true,
									'message' => "{$unidade['IS_DESCRICAO_ITEM']} - ".MSG_SUCCESS ,
									'lmga' => $unidade['IS_LMGA_PARCIAL']
								);
								
								if (
									$configuracaoCarAtiva
									&& $isCarObrigatorio
									&& isset($unidade['IS_CAR'])
								) {
									$item = $ItensSegurados->getItemByPropostaNroItemSegurado($Proposta->id, $unidade['nr_item_segurado']);
									$modelCar = new Seguro_Model_ItensSeguradosCAR();

									$itemCars = $modelCar->getCarsByNumerosItens($Proposta->id, [$unidade['nr_item_segurado']]);

									$itemLocalizacaoSemCar = empty($unidade['IS_CAR']) && empty($itemCars);
									$carPreenchidoComLmgaZerado = !empty($unidade['IS_CAR'])
										&& (
											(float) $unidade['IS_AREA'] == 0
											|| (float) $unidade['IS_PRODUTIVIDADE'] == 0
											|| (float) $unidade['IS_VALOR_TONELADA'] == 0
										);

									$carNaoPreenchidoComLmgaNaoZerado = empty($unidade['IS_CAR'])
										&& (float) $unidade['IS_AREA'] != 0
										&& (float) $unidade['IS_PRODUTIVIDADE'] != 0
										&& (float) $unidade['IS_VALOR_TONELADA'] != 0;

									$avisoItemLocalizacaoSemCar = $itemLocalizacaoSemCar
										&& ($carPreenchidoComLmgaZerado || $carNaoPreenchidoComLmgaNaoZerado);

									$result['unidades'][$nro]['avisoItemLocalizacaoSemCar'] = $avisoItemLocalizacaoSemCar;
									
									$carSelecionadoAnteriormente = $modelCar->getCarSelecionado($item['id']);
									$modelCar->unselect($item['id']);

									// CAR anterior é manual
									if (
										$carSelecionadoAnteriormente
										&& $carSelecionadoAnteriormente['fl_manual']
										&& $carSelecionadoAnteriormente['ds_car'] != Agro_Util::carUnmask($unidade['IS_CAR'])
									) {
										$modelCar->delete($carSelecionadoAnteriormente['id']);
									}

									if (!empty($unidade['IS_CAR'])) {
										$car = $modelCar->getCarByNumeroItemSeguradoNumeroCar(
											$Proposta->id,
											$unidade['nr_item_segurado'],
											$unidade['IS_CAR']
										);
										
										// Se CAR selecionado é oriundo da API
										if ($car) {
											$modelCar->update([
												'fl_selecionado' => 1
											], 'id = ' . $car['id']);
										} else {
											$modelCar->save([
												'id_item_segurado' => $item['id'],
												'ds_car' => Agro_Util::carUnmask($unidade['IS_CAR']),
												'fl_selecionado' => true,
												'fl_manual' => true,
											]);
										}
									}
								}
							} else {
								$result['unidades'][$nro] = array('status' => false, 'message' => "Erro ao salvar itens segurados");
								$error = $erroParaAndamentoEndosso = true;
							}
						}

						if (isset($unidade['IS_AREA'])) {
							$result['totalizadorArea'] += Agro_Util::formatDbCurrency($unidade['IS_AREA'], 2, '.', false);
						}

						if (!$itemLocalizacaoSemCar && empty($unidade['IS_CAR'])) {
							if (!$Regras->error && $Produto['ds_nome_produto'] == 'Pastagem Protegida - Índice') {
								$it = $ItensSegurados->getItemByPropostaNroItemSegurado($Proposta->id, $unidade['nr_item_segurado']);
								$unidade['IS_LMGA_PARCIAL'] = number_format($it['vl_lmga'],2, ',', '.');

								if ($Proposta->isEndosso() || $Proposta->isSolicitacaoEndosso()) {
									$IS_VALOR_CUSTEIO = str_replace(',', '.', str_replace('.','',$unidade['IS_VALOR_CUSTEIO']));
									$unidade['IS_LMGA_PARCIAL'] = number_format(($unidade['IS_AREA'] * $IS_VALOR_CUSTEIO), '2', ',', '.');
								}
							}

							if (isset($unidade['IS_LMGA_PARCIAL'])) {
								$result['totalizadorLmga'] += Agro_Util::formatCurrencyDb($unidade['IS_LMGA_PARCIAL']);
							}
						}

						if ((int)$unidade['IS_LMGA_PARCIAL'] > 0 && (float)$unidade['IS_LMGA_PARCIAL'] > 0) {
							$Regras->RN_IS_07($propriedades, $unidade, $Proposta);
						}

						if ($Regras->error) {
							$result['unidades'][$nro] = array(
								'status' => false,
								'message' => $Regras->message,
								'lmga' => $unidade['IS_LMGA_PARCIAL']
							);
							$erroParaAndamentoEndosso = true;
						}
					}

					$result['totalizadorArea'] = Agro_Util::formatDbCurrency($result['totalizadorArea'], 2, '.', false);
					$result['totalizadorLmga'] = Agro_Util::formatDbCurrency($result['totalizadorLmga']);
				}

				$ItensSegurados->reOrdena($Proposta->id);
			}
			
			if ($error == false) {
				if ($this->getRequest()->getParam('validar_capacidade')) {
					// VALIDA O LIMITE DE LMGA POR PROPOSTA
					$ValidacoesLimiteCapacidades = $Proposta->getValidacaoLimiteCapacidade();
        			if (is_array($ValidacoesLimiteCapacidades) && count($ValidacoesLimiteCapacidades)) {
        				foreach ($ValidacoesLimiteCapacidades as $idValidacao => $Validacao) {
                           if ($Proposta->verificaCoberturas($Validacao['coberturas']) and count($Validacao['municipios']) == 0 and !$Validacao['fl_limite_corretor']) {
        						$Utilizado = $Proposta->getValorUsadoLimiteCapacidade($idValidacao, $Validacao['coberturas']);
        						$Utilizado = ($Utilizado ? $Utilizado : 0);
        						if (($Utilizado + $Proposta->lmga()) >= $Validacao['vl_limite_capacidade']) {
        							$return['message'] = "Limite da Capacidade atingido. Validação Id = '{$Validacao['id']}'";
        							$return['status'] = false;
        						}
        					}

        					if ($Proposta->verificaCoberturas($Validacao['coberturas']) and $Validacao['fl_limite_corretor'] and $Proposta->verificaCorretor($Validacao['corretores']) and count($Validacao['municipios']) == 0) {
        						$Utilizado = $Proposta->getValorUsadoLimiteCapacidade($idValidacao, $Validacao['coberturas'], false, false, $Validacao['fl_limite_corretor']);
        						$Utilizado = ($Utilizado ? $Utilizado : 0);
        						if (($Utilizado + $Proposta->lmga()) >= $Validacao['vl_limite_capacidade']) {
        							$return['message'] = "Limite da Capacidade atingido. Validação Id = '{$Validacao['id']}'";
        							$return['status'] = false;
        						}
        					}

        					if ($Proposta->verificaMunicipio($Validacao['municipios'])) {
        					    if(($Validacao['fl_limite_corretor'] && $Proposta->verificaCorretor($Validacao['corretores'])) || !$Validacao['fl_limite_corretor']){
            						$Utilizado = $Proposta->getValorUsadoLimiteCapacidade($idValidacao, $Validacao['coberturas'], true, $Validacao['fl_agrupar_municipios'], $Validacao['fl_limite_corretor']);
            						$Utilizado = ($Utilizado ? $Utilizado : 0);
            						if (($Utilizado + $Proposta->lmga()) >= $Validacao['vl_limite_capacidade']) {
            							$return['message'] = "Limite da Capacidade atingido. Validação Id = '{$Validacao['id']}'";
            							$return['status'] = false;
            						}
        					    }
            				}
        				}
        			}
				}

				if ($this->getRequest()->getParam('recalcular') && $error == false) {
					//$Propostas->gera_versao($Proposta->id);
					$Proposta->recalcula(false, true);

					$result['custo_apolice'] = $Proposta->atributo_rn('PROPRIEDADE', 'PROD_CUSTO_APOLICE');
					$result['coberturas'] = $Proposta->coberturas_contratadas();
					$result['premio_liquido'] = $Proposta->premio_liquido();
					$result['premio_pagar'] = $Proposta->premio_liquido() - $result['custo_apolice'];
					$result['area'] = $Proposta->area();
					$result['lmga'] = $Proposta->lmga();
				}

				if($Proposta->status() != 'NAO_ENVIADA' && $Proposta->status() != 'DEVOLVIDA' && $Proposta->status() != 'PROPOSTA_INCOMPLETA' && $Proposta->status() != 'APOLICE_CANCELADA'){
					$result['execute'] = "if (window.opener){ window.opener.$('#frmFilter').submit();}";

				    if ($post['abriuPopup'] === '0') {
                        $result['execute'] = "$('#frmFilter').submit();";
                    }
				}

				// Verifica se é um endosso
				if ($Proposta->id_endosso && $error == false && !$erroParaAndamentoEndosso) {
					$Original = $Propostas->find($Proposta->id_proposta_endossada)->current();

					if ($Proposta->isEndosso() && $Original) {
						if ($Proposta->lmga() != $Original->lmga()) {
							Agro_Db_Table_Abstract::getDefaultAdapter()->query("update seguro.propostas_endosso set fl_coberturas_atualizadas = false where id_endosso = {$Proposta->id}");
							$result['execute'] = "$.executeResumo();";
						}
					}

					if (!$Proposta->isEndosso()) {
						$hash = (new Seguro_Model_PropostasHashOrcamento())->save($Proposta->id);
						if (!$hash) {
							throw new Exception("Não foi possível criar a hash do orçamento.");
						}
					}

					$result['execute'] .= "
					if ($('#click_unidades')) {
						$('#click_unidades').attr('href', '/endosso/ajax/unidades/id/".$Proposta->id."');
					}
					";

					Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
				} else {
					Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
				}
			} else {
				Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
			}
		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
			$result = array('status' => false, 'message' => $e->getMessage());
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	/**
	 * Retorna o Resumo e o Parcelamento da Proposta
	 */
    public function reloadresumoparcelamento()
    {
		$return = array();

		if ($this->getRequest()->getParam('id_proposta')) {
			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($this->getRequest()->getParam('id_proposta'))->current();
			$propriedades = $Proposta->atributos('PROPRIEDADE');

			$return['id_proposta'] = $this->getRequest()->getParam('id_proposta');
			$return['lmga'] = Agro_Util::formatDbCurrency($Proposta->lmga());
			$return['area'] = $Proposta->area();
			$return['unidades'] = $Proposta->unidades();
			$return['coberturas'] = $Proposta->coberturas();
			$return['premio_liquido'] = $Proposta->premio_liquido();
			$return['premio_pagar'] = $return['premio_liquido'] + $propriedades['PROD_CUSTO_APOLICE'];
			$return['parcelamento'] = $Proposta->parcelamento();
		}

		return Zend_Json::encode($return);
	}

    public function mapaAction()
    {
		$options = $this->getFrontController()->getParam('bootstrap')->getApplication()->getOptions();
		$this->view->key = $options['gdata']['mapskey'];
		$this->getHelper('layout')->disableLayout();

		if ($this->getRequest()->getParam('proposta')) {
			if ($this->getRequest()->getParam('quadra')) {
				$Itens = new Seguro_Model_ItensSegurados();
				$this->view->quadra = $Itens->find($this->getRequest()->getParam('quadra'))->current();
			} else {
				$Propostas = new Seguro_Model_Propostas();
				$Proposta = $Propostas->find($this->getRequest()->getParam('proposta'))->current();
				$this->view->propriedade = $Proposta->propriedade();
				$this->view->rows = $Proposta->itens_segurados();
			}
		}
	}

    private function verifica_erro($array)
    {
		if (is_array($array)) {
			foreach ($array as $item) {
				if (!$item['IS_STATUS']) {
					return true;
				}
			}
		}

		return false;
	}
}
