<?php

class Sinistro2_LaudofinalController extends Agro_Controller_Action{

    public function getModel() {
        return new Sinistro2_Model_LaudosFinais();
    }

    /**
	 * Redireciona a página para o formulário de cadastro
	 * de laudo da cobertura inforada
	 */
	public function setlaudofinalAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$Lf = new Zend_Session_Namespace('laudo_final');

		$Lf->idVistoria   = $this->getRequest()->getParam('id_vistoria');
		$Lf->idCobertura  = $this->getRequest()->getParam('id_cobertura');
		$Lf->idProposta   = $this->getRequest()->getParam('id_proposta');
		$Lf->idProcesso   = $this->getRequest()->getParam('id_processo');
		$Lf->idLaudoFinal = $this->getRequest()->getParam('id_laudo_final');

		if ($Lf->idRevistoria) {
			$Lf->__unset('idRevistoria');
		}

		$idProposta  = $this->getRequest()->getParam('id_proposta');
		$idCobertura = $this->getRequest()->getParam('id_cobertura');

		// Busca o schema da safra
		$Safra = new Produto_Model_Safras();
		$schema = $Safra->getSafraModel($idProposta);

		//Busca o controller do form de cadastro do laudo.
		$LaudoFinal = new Sinistro2_Model_LaudosFinais();
		$controller = $LaudoFinal->getController($idProposta,$idCobertura,$schema);

		$url = '/' . $schema .'/' . $controller . '/form';

		if($this->getRequest()->getParam('id_laudo_final')){
			$url .= '/id/' . $this->getRequest()->getParam('id_laudo_final');
		}
		//echo $url;
		$this->_redirect($url);
	}

    public function salvaquadrasnaovistoriadasAction() {
        $this->getHelper('ViewRenderer')->setNoRender();
        $this->getHelper('layout')->disableLayout();

        $idLaudoFinal = $this->getRequest()->getParam('id_laudo_final');

        $arItensNaoVistoriados = array();
        $arItensNaoVistoriados = $this->getRequest()->getParam('id_motivo_quadra_nao_vistoriada');

        $LaudosFinaisItensSegurados = new Sinistro2_Model_LaudosFinaisItensSegurados();

        foreach ($arItensNaoVistoriados as $idItemNaoVistoriado=>$idMotivoNaoVistoriado) {
            if($idMotivoNaoVistoriado != '') {
                $LaudosFinaisItensSegurados->delete($idLaudoFinal, $idItemNaoVistoriado);
            }
            if($idItemNaoVistoriado && $idMotivoNaoVistoriado) {
                if($idMotivoNaoVistoriado != 0) {
                    $dados = array();
                    $dados['id_laudo_final'] = $idLaudoFinal;
                    $dados['id_item_segurado'] = $idItemNaoVistoriado;
                    $dados['fl_nao_vistoriada'] = true;
                    $dados['id_motivo_quadra_nao_vistoriada'] = $idMotivoNaoVistoriado;

                    $LaudosFinaisItensSegurados->save($dados);
                }
            }
        }

        $this->getResponse()->setBody(Zend_Json::encode(MSG_SUCESS));
    }

    public function setstatusAction() {
    	$this->isAjax();
    	$result = array('status' => false);

    	if ($this->getRequest()->getParam('status') && $this->getRequest()->getParam('id_laudo')) {
    		$LaudosFinais = new Sinistro2_Model_LaudosFinais();
    		$Laudo = $LaudosFinais->find($this->getRequest()->getParam('id_laudo'))->current();
    		$Laudo->id_status = $LaudosFinais->getIdStatus($this->getRequest()->getParam('status'), 'LF');
    		$result['status'] = $Laudo->save();
    	}

    	$this->getResponse()->setBody(Zend_Json::encode($result));
    }

    public function loaditensseguradoslaudofinalAction() {
        $this->getHelper('layout')->disableLayout();

        $params = $this->getRequest()->getParams();

        $ModelLaudosFinais = $this->getModel();
        $this->view->data = array();
        $this->view->data['itens_segurados'] = $ModelLaudosFinais->getItensSeguradosLaudoFinal($params['id_proposta'], $params['id_cobertura'], $params['id_vistoria'], $params['id_laudo_final']);
        $this->view->data['id_laudo_final'] = $params['id_laudo_final'];
        $this->view->data['id_proposta'] = $params['id_proposta'];
        $this->view->data['id_processo'] = $params['id_processo'];
        $this->view->data['ds_module'] = $params['module_name'];
        $this->view->data['ds_controller'] = $params['controller_name'];
		$this->view->data['id_vistoria'] = $params['id_vistoria'];
		$this->view->data['id_cobertura'] = $params['id_cobertura'];
        $this->view->data['fl_vistoria_preliminar'] = $params['fl_vistoria_preliminar'];
		$this->view->data['is_digital'] = $ModelLaudosFinais->isMetodoDigital($params['id_laudo_final']);
    }

	public function envialaudofinalAction() {
		$this->isAjax();
		$params = $this->getRequest()->getParams();


		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

		$Model_Status         = new Sistema_Model_Status();
		$Model_LaudosFinais   = $this->getModel();
		$Model_LaudosFinaisIS = new Sinistro2_Model_LaudosFinaisItensSegurados();
		$isLaudoLF003LF034 = !empty($params['controller_name']) && in_array($params['controller_name'], ['lf003', 'lf034']);

		/*
		 * Verifica se os laudos escaneados foram inserios para todos os itens segurados
		 */
		$flErroArquivo = false;
		$arIdMotivoSemLaudo = array(6,8,9,10); //motivos para não realização de vistoria que não obrigam laudos.
		
		$RowIS = $Model_LaudosFinaisIS->getLaudoEscaneado($params['id_laudo_final']);
		foreach($RowIS as $key => $laudoFisico){
			if(($laudoFisico['ds_nome_laudo_fisico'] == null || $laudoFisico['ds_nome_laudo_fisico'] == '' ) && (!in_array($laudoFisico['id_motivo_quadra_nao_vistoriada'], $arIdMotivoSemLaudo))){
				$flErroArquivo = true;
			}
		}

		if($flErroArquivo == true){

			$response = array('complete' => false, 'message' => 'Favor incluir o laudo escaneado em PDF em todos os talhões.');

		} else {
			$LaudoFinal = $Model_LaudosFinais->getLaudoFinal($params['id_laudo_final']);

			/*
			 * Verifica se todos os itens segurados da vistoria possuem preenchimento
			 */
			if($Model_LaudosFinais->verificaTodosItensVistoriados($LaudoFinal['id_vistoria']) > 0){

				Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
				$response = array('complete' => false, 'message' => 'Digite um laudo para cada item!');
			} elseif ($isLaudoLF003LF034 && $Model_LaudosFinais->possuiAssinaturasNaoPreenchidas($LaudoFinal['id_laudo_final'])) {

				Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
				$response = array('complete' => false, 'message' => 'Selecione a opção se os itens segurados foram ou não assinados e salve o laudo.');
			} else {

				/*
				 * Caso seja uma Nova Avaliação, seta a vistoria reavalidada como não valida
				 */
				$Vistoria = $Model_LaudosFinais->getVistoriaByLaudoFinal($params['id_laudo_final']);

				//pega os itens do novo laudo
				$ModelLaudoFinalItemSegurado = new Sinistro2_Model_LaudosFinaisItensSegurados();
				$ItensSegurados = $ModelLaudoFinalItemSegurado->fetchAll('id_laudo_final = '.$params['id_laudo_final'])->toArray();

				if($Vistoria['id_vistoria_reavaliada'] > 0){

					//pega o laudo da vistoria reavaliada
					$ModelVistoriasLaudosFinais = new Sistema_Model_VistoriasLaudosFinais();
					$LaudoAnterior = $ModelVistoriasLaudosFinais->fetchRow('id_vistoria = '.$Vistoria['id_vistoria_reavaliada']);

					//percorre os itens do novo laudo, atualizando o laudo anterior
					foreach ($ItensSegurados as $item) {
						$ModelLaudoFinalItemSegurado->update(array('fl_disponivel_liquidacao' => 'false'), 'id_laudo_final = '.$LaudoAnterior['id_laudo_final'] . ' and id_item_segurado = ' . $item['id_item_segurado']);
					}
				}

				/*
				 * Altera o status do Laudo Final para ENVIADO ou ENVIADO_NAO_ASSINADO
				 */
				$Row = $Model_LaudosFinais->getRow($params['id_laudo_final']);

				if ($isLaudoLF003LF034) {

					$flAssinado = !empty($ItensSegurados) ? true : false;
					foreach ($ItensSegurados as $item) {
						
						if ($item['fl_assinado'] == false) {
							$flAssinado = false;
							break;
						}
					}

					if ($flAssinado) {
						$idStatus = $Model_Status->getIdStatus('ENVIADO', 'LF');
					} else {
						$idStatus = $Model_Status->getIdStatus('ENVIADO_NAO_ASSINADO', 'LF');
					}

				} else {
					if($Row->fl_assinatura_segurado == true){
						$idStatus = $Model_Status->getIdStatus('ENVIADO', 'LF');
					} else {
						$idStatus = $Model_Status->getIdStatus('ENVIADO_NAO_ASSINADO', 'LF');
					}
				}
				
				$Row->id_status = $idStatus;

				if($Row->save()){


					if (empty($params['controller_name']) || !in_array($params['controller_name'], ['lf003', 'lf034'])) {

						$Model_VA = new Sinistro2_Model_VistoriasAvisos();
						$AvisosVistoria = $Model_VA->getAvisos($LaudoFinal['id_vistoria']);
	
						$Model_LaudoPreliminar = new Sinistro2_Model_LaudosPreliminares();
						$idLaudoPreliminar = $Model_LaudoPreliminar->getLaudosPreliminaresByAviso(
							(int)$LaudoFinal['id_vistoria']
						);
	
						//Se a cobertura possui preliminar, verifica se para os avisos a serem vistoriados, a preliminar foi dispensada
						if($idLaudoPreliminar && $Model_LaudosFinais->possuiPreliminar($LaudoFinal['id_proposta'], $LaudoFinal['id_cobertura'])){
							$rsItensSegurados = $Model_LaudosFinais->getItensSeguradosLaudoFinalComPreliminar($LaudoFinal['id_proposta'], $AvisosVistoria, $LaudoFinal['id_cobertura']);
						} else {
							$rsItensSegurados = $Model_LaudosFinais->getItensSeguradosSemLaudo($LaudoFinal['id_cobertura'], $LaudoFinal['id_proposta'], $LaudoFinal['id_vistoria']);
						}
	
						/*
						 * Se ainda tiver itens segurados pendentes, sem LF para aquela cobertura, um novo agendamento será criado
						*/
						if(count($rsItensSegurados) > 0 && !$LaudoFinal['fl_evento_nao_constatado']){
							$ModelAgendamento = new Sistema_Model_Agendamentos();
	
							$dataAgendamento['ds_tipo']      = 'FINAL';
							$dataAgendamento['id_cobertura'] = $LaudoFinal['id_cobertura'];
							$dataAgendamento['id_processo']  = $LaudoFinal['id_processo'];
							$dataAgendamento['id_empresa']   = $LaudoFinal['id_empresa'];
							//$dataAgendamento['id_vistoria']  = $LaudoFinal['id_vistoria'];
							//comentado porque estava criando salvando id_vistoria_reavaliada 
							//(linha 248 do model Agendamentos) quando na verdade não é.
	
							$ModelAgendamento->abreAgendamento($dataAgendamento);
						}
					}

                    (new Sinistro2_Service_LaudosFinaisHistorico(new Log_Model_LaudosFinaisHistorico()))
                        ->salvarHistorico($params['id_laudo_final'], Log_Model_LaudosFinaisHistorico::ACAO_ENVIAR);

					Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

					$response = array('complete' => true, 'message' => 'Laudo enviado com sucesso!');

				} else {
					Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();

					$response = array('complete' => false, 'message' => 'Erro ao enviar laudo!');
				}

				if ($response['complete']) {

					if (!empty($params['controller_name']) && in_array($params['controller_name'], ['lf003', 'lf034'])) {
						
						try {
							$user = Zend_Auth::getInstance()->getIdentity();
							//rabbitmq
							$os = strtoupper(substr(PHP_OS, 0, 3));
							$env = ($os == 'WIN') ? 'docker' : getenv('APPLICATION_ENV');
							$modelRpcClient = new Agro_RabbitMQ_VSD_RpcClient($env, 'vsd');
							$modelRpcClient->execute([
								'id_vistoria' => $LaudoFinal['id_vistoria'],
								'id_usuario' => $user->id,
								'acao' => 'gerarNovaVistoria'
							]);
						} catch (\Throwable $th) {
							$response['message'] .= " Porém não foi possível gerar a nova vistoria.";
							
							if (Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgroTI()) {
								$response['message'] .= "\n\nErro: {$th->getMessage()}";
							}
						}
					}
				}
			}
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function devolvelaudofinalAction()
    {
        $this->isAjax();
        $params = $this->getRequest()->getParams();

        $this->getService((new Log_Model_LaudosFinaisHistorico()))
            ->devolverLaudo((int)$params['id_laudo_final']);

        $response = array('complete' => true, 'message' => 'Laudo devolvido com sucesso!');
        $this->getResponse()->setBody(Zend_Json::encode($response));
    }

	public function iscompleteAction() {
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$params = $this->getRequest()->getParams();

		if ($params['id_laudo_final']){

			$Model_LaudosFinais = new Sinistro2_Model_LaudosFinais();

			$LaudoFinal = $Model_LaudosFinais->getLaudoFinalGeneralizacao($params['id_laudo_final']);

			if ($LaudoFinal['ds_chave_status'] == 'AGUARDANDO_ENVIO' && $Model_LaudosFinais->isComplete($params['id_laudo_final'])) {
				$response = array('complete' => true);
			} else {
				$response = array('complete' => false);
			}

		} else {
			$response = array('complete' => false);
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function adicionaitenslaudofinalAction(){
		$this->getHelper('layout')->disableLayout();

        $ModelLfis = new Sistema_Model_VistoriasItensSegurados();
		$ModelIs = new Seguro_Model_ItensSegurados();

		$params = $this->getRequest()->getParams();

        $Rows = $ModelLfis->fetchAll("id_vistoria=".$params["id_vistoria"]);

		$itens_laudo = array();
		foreach ($Rows as $item){
			$itens_laudo[] = $item->id_item_segurado;
		}

		if (count($itens_laudo)){
			$ItensSegurados = $ModelIs->fetchAll("id_proposta={$params["id_proposta"]} and id not in (".implode(", ", $itens_laudo).")", "nr_item_segurado");
		} else {
			$ItensSegurados = $ModelIs->fetchAll("id_proposta={$params["id_proposta"]}", "nr_item_segurado");
		}

		$this->view->id_proposta 	 = $params["id_proposta"];
		$this->view->id_laudo_final  = $params["id_laudo_final"];
		$this->view->itens_segurados = $ItensSegurados;
		$this->view->id_vistoria 	= $params['id_vistoria'];
	}

	public function insereitensnovosAction(){
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$params = $this->getRequest()->getParams();

		if ($params["id_item_segurado"]){
			$response = array("status" => false, "message"=>"");

			$ModelLfIs = new Sinistro2_Model_LaudosFinaisItensSegurados();

			try {
				foreach ($params["id_item_segurado"] as $id_item_segurado){
					$Row = $ModelLfIs->createRow();
					$Row->id_laudo_final = $params["id_laudo_final"];
					$Row->id_item_segurado = $id_item_segurado;

					$Row->save();

					$ModelVistoriasItens = new Sistema_Model_VistoriasItensSegurados();
					$RowVisIt = $ModelVistoriasItens->createRow();
					$RowVisIt->id_vistoria = $params['id_vistoria'];
					$RowVisIt->id_item_segurado = $id_item_segurado;

					$RowVisIt->save();
				}

				$response["status"] = true;

			} catch (Exception $e) {
				$response["message"] = "Não foi possível atribuir o Item Segurado. \nErro: $e->getMessage()";
				Agro_Util::informaErroAgronet($e->getMessage());
			}
		} else {
			$response["message"] = "É necessário selecionar ao menos 1 item para inserção.";
		}

		$this->getResponse()->setBody(Zend_Json::encode($response));
	}

	public function itensreavaliacaoAction(){
		$this->getHelper('layout')->disableLayout();

		$ModelIs = new Seguro_Model_ItensSegurados();

		$params = $this->getRequest()->getParams();

		$ItensSegurados = $ModelIs->fetchItensProposta($params["id_proposta"], true);

		$this->view->id_proposta 	 = $params["id_proposta"];
		$this->view->id_laudo_final  = $params["id_laudo_final"];
		$this->view->itens_segurados = $ItensSegurados;
		$this->view->id_vistoria 	= $params['id_vistoria'];
	}

	public function replicadanositenslaudofinalAction(){
		$this->getHelper('layout')->disableLayout();

		$params = $this->getRequest()->getParams();

		$ModelLaudoFinal = new Sinistro2_Model_LaudosFinais();

		$ItensSegurados = $ModelLaudoFinal->getItensSeguradosLaudoFinal($params['id_proposta'],$params['id_cobertura'],$params['id_vistoria'],$params['id_laudo_final']);

		$this->view->id_proposta 	 = $params["id_proposta"];
		$this->view->id_laudo_final  = $params["id_laudo_final"];
		$this->view->itens_segurados = $ItensSegurados;

	}

	public function concatenaitensseguradosAction(){
		$this->getHelper('ViewRenderer')->setNoRender();
		$this->getHelper('layout')->disableLayout();

		$params = $this->getRequest()->getParams();

		$result = array("status"=>false, "itens"=>"");

		if ($params["id_item_segurado"]){
			$result["status"] = true;
			$result["itens"] = implode("-", $params["id_item_segurado"]);
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

    public function loadlaudoescaneadoAction() {
        $this->getHelper('layout')->disableLayout();

        $params = $this->getRequest()->getParams();

        $ModelLaudosFinais = $this->getModel();
        $this->view->data = array();
        $this->view->laudoEscaneado = $ModelLaudosFinais->getLaudoEscaneado($params['id_laudo_final']);
    }


    public function enviatabletAction(){

    	$this->isAjax();
    	$ModelLaudosFinais = $this->getModel();
    	$ModelProposta     = new Seguro_Model_Propostas();

    	try {
    		$result = array("status"=>true, "message" => "Laudo transmitido com sucesso para o Tablet", "type"=>"success");

    		Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

    		//(1: Multiriesgo, 2: Granizo, 3: Incendio, 4: Viento, 5: Helada, 6: Otro, 7: Sequía, 8: Inundación)

    		switch($this->getRequest()->getParam('id_cobertura')){
    			case '18': $idEvento = 1; break;
    			case '1' : $idEvento = 2; break;
    			case '27': $idEvento = 3; break;
    			case '20': $idEvento = 4; break;
    			case '3' : $idEvento = 5; break;
    			case '': $idEvento = 7; break;
    			case '': $idEvento = 8; break;
    			default  : $idEvento = 6;
    		}

    		$Proposta   = $ModelProposta->find($this->getRequest()->getParam('id_proposta'))->current();

    		$RsVistoria = $ModelLaudosFinais->getDadosEnviaTablet($this->getRequest()->getParam('id_proposta'), $this->getRequest()->getParam('id_cobertura'), $this->getRequest()->getParam('id_vistoria'));

    		$arCoordenadas = explode(" , ", $RsVistoria['ds_coordenadas']);
    		$arLatitude    = explode(" ", $arCoordenadas[0]);
    		$arLongitude   = explode(" ", $arCoordenadas[1]);

    		$lat = $arLatitude[0]+((($arLatitude[1]*60)+($arLatitude[2]))/3600);
    		$log = $arLongitude[0]+((($arLongitude[1]*60)+($arLongitude[2]))/3600);

    		$xmlInspection ='<?xml version="1.0" encoding="utf-8"?>
								<Inspection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="LossInspection">
									<InspectionObservations>'.$RsVistoria["avisos"].'</InspectionObservations>
									<Establishment>
										<EstablishmentName>'.$RsVistoria["ds_nome_propriedade"].'</EstablishmentName>
										<TownId>'.$RsVistoria["id_municipio"].'</TownId>
										<DistrictId>'.$RsVistoria["id_estado"].'</DistrictId>
										<EstablishmentGPSLatitude>'.$lat.'</EstablishmentGPSLatitude>
										<EstablishmentGPSLongitude>'.$log.'</EstablishmentGPSLongitude>
										<EstablishmentObservation>'.$RsVistoria["ds_referencia_localizacao"].'</EstablishmentObservation>
									</Establishment>
									<Contact>
										<ContactMobile>'.$RsVistoria["ds_tel_celular"].'</ContactMobile>
										<ContactName>'.$RsVistoria["ds_nome_proponente"].'</ContactName>
										<ContactTelephone>'.$RsVistoria["ds_tel_residencia"].'</ContactTelephone>
									</Contact>
								  <Images/>
								  <Policies>
								    <Policy>
										<Insured>
											<InsuredName>'.$RsVistoria["ds_nome_proponente"].'</InsuredName>
											<InsuredTelephone>'.$RsVistoria["ds_tel_residencia"].'</InsuredTelephone>
										</Insured>
										<InspectionCompanyCode>1001777</InspectionCompanyCode>
										<PolicyNumber>'.$RsVistoria["nr_apolice"].'</PolicyNumber>
										<EventDate xsi:nil="true">'.$RsVistoria["dt_sinistro"].'</EventDate>
										<LossClaimDate xsi:nil="true">'.$RsVistoria["dt_criacao"].'</LossClaimDate>
										<PolicyEffectiveDate xsi:nil="true">'.$RsVistoria["dt_aceitacao"].'</PolicyEffectiveDate>
										<Events>
											<Event><EventId>'.$idEvento.'</EventId></Event>
										</Events>
										<OtherEventDescr>Otro</OtherEventDescr>
							      		<PolicyCoverages>
							          		<Coverage>
												<CoverageAffectedArea>true</CoverageAffectedArea>
							          			<CoverageInsuredArea>true</CoverageInsuredArea>
							          			<CoveragePercentage>100.0</CoveragePercentage>
							          			<EventId>'.$idEvento.'</EventId>
							          			<CoverageExcess>false</CoverageExcess>
							        		</Coverage>
							      		</PolicyCoverages>
								    </Policy>
								  </Policies>
								  <RequestedShares>';

    		foreach($Proposta->unidades(false) as $item) {
    			$xmlInspection .= '
										<RequestedShare xsi:type="LossRequestedShare">
											<ShareArea>'.$item["IS_AREA"].'</ShareArea>
											<ShareAffectedArea>'.$item["IS_AREA"].'</ShareAffectedArea>
											<ShareName>'.$item["IS_ITEM"].'</ShareName>
											<CropTypeId>9999</CropTypeId>
											<SharePotentialYield>'.$item["IS_PRODUTIVIDADE"].'</SharePotentialYield>
											<SowedDate xsi:nil="true">'.$item["IS_DATA_SEMEADURA"].'</SowedDate>
											<InsuredAmountPerUnitMetric>P</InsuredAmountPerUnitMetric>
											<InsuredAmountPerUnit>0</InsuredAmountPerUnit>
										</RequestedShare>
    								';
    		}

    		$xmlInspection .= '</RequestedShares>
							</Inspection>';


    		$xmlInspection64 = base64_encode($xmlInspection);
    		$user            = "wwTkG/uIQ+5WdWOYcu/IG2wwTakUr7xK"; //crypt("inspectorAgroNet");
    		$password        = "G7405ibF82gnlZ49wHu0ig=="; //crypt("pass12345");

    		$xml = '
				    <CreateNewInspection xmlns="http://tempuri.org/">
				      <userName>'.$user.'</userName>
				      <userPassword>'.$password.'</userPassword>
				      <newInspection>'.$xmlInspection64.'</newInspection>
				    </CreateNewInspection>
    		';

    		require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");

    		$client = new nusoap_client('http://www.taghgestion.com.ar:8131/SynchronizationBR.asmx');
    		$client->soap_defencoding = 'utf-8';
    		$client->xml_encoding = 'utf-8';
    		$client->decode_utf8 = false;

    		$arr = array('CreateNewInspection' => array(
    				'userName'      => $user,
    				'userPassword'  => $password,
    				'newInspection' => $xmlInspection64)
    		);

    		try{
    			$client->debug_flag=true;
    			$msg = $client->serializeEnvelope($xml);
    			$result = $client->send($msg, "http://tempuri.org/CreateNewInspection");

    			print_r(base64_decode($result['CreateNewInspectionResult']));

    		}catch(Exception $e){
    			dump($e);
    		}

    		Agro_Db_Table_Abstract::getDefaultAdapter()->commit();

    	} catch (Exception $e) {
    		Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();


    		$result['message'] = "Não foi possível enviar o laudo.\n\nErro:{$e->getMessage()}\n\n\n";
    		$result['status'] = false;
    		$result['type'] = "error";

    		Agro_Util::informaErroAgronet($e->getMessage());
    	}

    	$this->getResponse()->setBody(Zend_Json::encode($result));
    }

    public function getService(Log_Model_LaudosFinaisHistorico $modelLaudosFinaisHistorico = null): Sinistro2_Service_LaudosFinais
    {
        return new Sinistro2_Service_LaudosFinais($this->getModel(), $modelLaudosFinaisHistorico);
    }

	public function gerarlaudofinalAction(): void
	{
		$this->isAjax();
		$result = [
			"status"=> true,
			"message" => "Arquivo gerado com sucesso!",
		];

		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();
			
			$params = $this->getRequest()->getParams();
			$this->validarParametrosGerarPDF($params);

			$result['ds_nome_laudo_final'] = $this->getNomeLaudoFinal($params['id_laudo_final']);

			if (empty($result['ds_nome_laudo_final'])) {
				$result['ds_nome_laudo_final'] = $this->gerarNovoPDF($params['id_laudo_final'], $params['id_tipo_laudo_final']);
			}

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
		} catch (\Throwable $th) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollback();
			$result['status'] = false;
			$result['message'] = $th->getMessage();
		}

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function enviarlaudofinalAction(): void
	{
		$this->isAjax();
		$result = [
			"status"=> true,
			"message" => "Laudo final enviado com sucesso!",
		];

		$modelLaudosFinaisEnviosLogs = new Sinistro2_Model_LaudosFinaisEnviosLogs();

		try {
			$params = $this->getRequest()->getParams();
			$this->validarParametrosGerarPDF($params);
			
			$validaDadosEnvio = new Sinistro2_Service_ValidaDadosEnvio();
			$dadosEnvio = $validaDadosEnvio->executa($params['id_laudo_final'], Sinistro2_Service_ValidaDadosEnvio::TIPO_ENVIO_LAUDO);

			$result['ds_nome_laudo_final'] = $this->getNomeLaudoFinal($params['id_laudo_final'], true);

			if (empty($result['ds_nome_laudo_final'])) {
				$result['ds_nome_laudo_final'] = $this->gerarNovoPDF($params['id_laudo_final'], $params['id_tipo_laudo_final'], true);
			}

			$dadosEnvio['ds_caminho_arquivo'] = PATH_LAUDOS .'/'. $result['ds_nome_laudo_final'];
			$this->enviarLaudoFinal($dadosEnvio);
		} catch (\Throwable $th) {
			$result['status'] = false;
			$result['message'] = $th->getMessage();

			if (empty($dadosEnvio)) {
				$dadosEnvio = ['id_laudo_final' => $params['id_laudo_final']];
			}
		}

		$dadosEnvio['ds_mensagem'] = $result['message'];
		$dadosEnvio['fl_sucesso'] = $result['status'];
		$modelLaudosFinaisEnviosLogs->save($dadosEnvio);

		$this->getResponse()->setBody(Zend_Json::encode($result));
	}

	/**
	 * Valida se os parâmetros informados para a geração do PDF estão corretos
	 *
	 * @param array $params
	 */
	private function validarParametrosGerarPDF(array &$params): void
	{
		if (empty($params['id_laudo_final'])) {
			throw new Exception("Laudo final não informado");
		}

		if (!filter_var($params['id_laudo_final'], FILTER_VALIDATE_INT)) {
			throw new Exception("Id do laudo final inválido.");
		}

		if (empty($params['id_tipo_laudo_final'])) {
			throw new Exception("Tipo de laudo final não informado");
		}

		if (!filter_var($params['id_tipo_laudo_final'], FILTER_VALIDATE_INT)) {
			throw new Exception("Tipo de laudo final inválido.");
		}
	}

	/**
	 * Retorna o nome do laudo caso o PDF dele ele exista
	 *
	 * @param int $idLaudoFinal
	 * @param bool $flLaudoParaSegurado
	 * @return string
	 */
	private function getNomeLaudoFinal(int $idLaudoFinal, bool $flLaudoParaSegurado = false): string
	{
		$modelLaudosFinais = new Sinistro2_Model_LaudosFinais();

		if ($flLaudoParaSegurado) {
			$idPropostaMae = $modelLaudosFinais->getIdPropostaMaeByLaudoFinal($idLaudoFinal);
			$dsNomeLaudoFinal = "{$idPropostaMae}_VF_{$idLaudoFinal}_SEGURADO.pdf";
		} else {
			$dsNomeLaudoFinal = $modelLaudosFinais->getLaudoEscaneado($idLaudoFinal);
			
			if (empty($dsNomeLaudoFinal)) {
				$itens = $modelLaudosFinais->getItensLaudoFinal($idLaudoFinal);

				if (!empty($itens[0]) && !empty($itens[0]['ds_nome_laudo_fisico'])) {
					$dsNomeLaudoFinal = $itens[0]['ds_nome_laudo_fisico'];
				}
			}
		}

		return !empty($dsNomeLaudoFinal) && file_exists(PATH_LAUDOS .'/'. $dsNomeLaudoFinal) ? $dsNomeLaudoFinal : '';
	}

	/**
	 * Gera um novo PDF de laudo final a partir de seu id o de seu tipo
	 *
	 * @param int $idLaudoFinal
	 * @param int $idTipoLaudoFinal
	 * @param bool $flLaudoParaSegurado
	 * @return string
	 */
	private function gerarNovoPDF(int $idLaudoFinal, int $idTipoLaudoFinal, bool $flLaudoParaSegurado = false): string
	{
		$lfService = Sinistro2_Service_LaudoFinalPdf::getServiceLaudo($idTipoLaudoFinal);
		$dsNomeLaudoFinal = $lfService->gerarPDF($idLaudoFinal, $flLaudoParaSegurado);

		if (!$flLaudoParaSegurado) {
			$this->atualizarNomeLaudoFinal($idLaudoFinal, $dsNomeLaudoFinal);
		}

		return $dsNomeLaudoFinal;
	}

	/**
	 * Atualiza o nome do laudo final nos itens ou diretamente no laudo caso o mesmo tenha sido dispensado
	 *
	 * @param int $idLaudoFinal
	 * @param string $dsNomeLaudoFinal
	 */
	private function atualizarNomeLaudoFinal(int $idLaudoFinal, string $dsNomeLaudoFinal): void
	{
		if (strpos($dsNomeLaudoFinal, '_EV_N_CONST') !== false) {
			$modelLaudosFinais = new Sinistro2_Model_LaudosFinais();
			$modelLaudosFinais->update(
				['ds_nome_laudo_fisico' => $dsNomeLaudoFinal],
				"id = {$idLaudoFinal}"
			);
		} else {
			$modelLaudosFinaisItensSegurados = new Sinistro2_Model_LaudosFinaisItensSegurados();
			$modelLaudosFinaisItensSegurados->update(
				['ds_nome_laudo_fisico' => $dsNomeLaudoFinal],
				"id_laudo_final = {$idLaudoFinal}"
			);
		}
	}

	/**
	 * Envia o laudo final de acordo com o tipo de envio informado
	 *
	 * @param array $dadosEnvio
	 */
	private function enviarLaudoFinal(array $dadosEnvio): void
	{
		if (!file_exists($dadosEnvio['ds_caminho_arquivo'])) {
			throw new Exception("Arquivo do laudo não localizado.");
		}

		if ($dadosEnvio['ds_tipo_envio'] == 'WHATS') {
			$this->enviarPorWhatsApp($dadosEnvio);
			$this->enviarPorEmail($dadosEnvio, 'CORRETOR');
			return;
		}

		$this->enviarPorEmail($dadosEnvio, 'SEGURADO');
		$this->enviarPorEmail($dadosEnvio, 'CORRETOR');
	}

	/**
	 * Envia o laudo final por WhatsApp para o segurado
	 *
	 * @param array $dadosEnvio
	 */
	private function enviarPorWhatsApp(array $dadosEnvio): void
	{
		$conteudo = file_get_contents($dadosEnvio['ds_caminho_arquivo']);
		$base64 = base64_encode($conteudo);
		$telefoneSegurado = "55" . preg_replace('([^0-9])', '', $dadosEnvio['ds_telefone_segurado']);

		$whatsAppservice = new Agro_WhatsApp_Services_Wescctech();
		$whatsAppClient = new Agro_WhatsApp_Client($whatsAppservice);

		$retorno = $whatsAppClient->enviarMensagem(
			$telefoneSegurado,
			$this->substituirVariaveisTextosEnvio(LAUDO_FINAL_MENSAGEM_WHATSAPP_SEGURADO, $dadosEnvio)
		);

		if (!in_array($retorno->status, ['200', '201', '202'])) {
			$mensagem = "Erro ao realizar o envio da mensagem pelo WhatsApp. \n[{$retorno->status}] - {$retorno->msg}";
			throw new Exception($mensagem);
		}

		$retorno = $whatsAppClient->enviarArquivo(
			$telefoneSegurado,
			$base64,
			".pdf",
			"LaudoFinal"
		);

		if (!in_array($retorno->status, ['200', '201', '202'])) {
			$mensagem = "Erro ao realizar o envio do laudo pelo WhatsApp. \n[{$retorno->status}] - {$retorno->msg}";
			throw new Exception($mensagem);
		}
	}

	/**
	 * Envia o laudp final para e-mail para o corretor e para o segurando (este quando selecionado a opção EMAIL)
	 *
	 * @param array $dadosEnvio
	 * @param string $destinatario
	 */
	private function enviarPorEmail(array $dadosEnvio, string $destinatario): void
	{
		$mail = new Agro_Mail();

		if ($destinatario == 'SEGURADO') {
			$mail->addTo($dadosEnvio['ds_email_segurado']);
			$tituloEmail = $this->substituirVariaveisTextosEnvio(LAUDO_FINAL_TITULO_EMAIL_SEGURADO, $dadosEnvio);
			$corpoEmail = $this->substituirVariaveisTextosEnvio(LAUDO_FINAL_CORPO_EMAIL_SEGURADO, $dadosEnvio);
		} else {
			$mail->addTo($dadosEnvio['ds_email_corretor']);
			$tituloEmail = $this->substituirVariaveisTextosEnvio(LAUDO_FINAL_TITULO_EMAIL_CORRETOR, $dadosEnvio);
			$corpoEmail = $this->substituirVariaveisTextosEnvio(LAUDO_FINAL_CORPO_EMAIL_CORRETOR, $dadosEnvio);
		}

		$anexo = Agro_Mail::getAssinatura($mail, 2);
        $corpoEmail .= "<br><img src=\"cid:{$anexo->id}\" height=\"102\" width=\"480\" />";
        $corpoEmail .= Agro_Mail::textoPadraoEmailHtml();
		
		$mail->setSubject($tituloEmail);
		$mail->setBody($corpoEmail, 'html');
		
		$at = $mail->createAttachment(file_get_contents($dadosEnvio['ds_caminho_arquivo']));
		$at->type = 'application/pdf';
		$at->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
		$at->encoding = Zend_Mime::ENCODING_BASE64;
		$at->filename = 'laudo_final.pdf';

		$mail->send();
	}

	/**
	 * Substitui as variáveis do texto pelos dados de envio
	 *
	 * @param string $texto
	 * @param array $dadosEnvio
	 * @return string
	 */
	private function substituirVariaveisTextosEnvio(string $texto, array $dadosEnvio): string
	{
		$variaveis = [
			"id_vistoria",
			"proposta_completa",
			"nome_segurado",
			"dt_vistoria",
			"id_proposta",
		];

		foreach ($variaveis as $variavel) {
			$texto = str_replace("[{$variavel}]", $dadosEnvio[$variavel], $texto);
		}

		return $texto;
	}

}
