<?php

use DocuSign\eSign\Model\Zip;

class Endosso_Model_Endossar extends Agro_Db_Table_Propostas {
	protected $_rowClass = 'Endosso_Model_Row_Endossar';
	protected $_name = 'propostas';
	protected $_schema = 'seguro';
	protected $_primary = 'id';
	private $id_endosso;

	public function proposta($idProposta, $flLote=false, $nrParcelas=null, bool $importarItensLaudo = false) {
		$Proposta = $this->find($idProposta)->current();

		$existeEndosso = $this->_verificaEndosso($Proposta);
		if ($existeEndosso) {
			$this->setMessage("ATENÇÃO\n\nJá existe um endosso para esta proposta.\n\nCódigo do endosso: $existeEndosso");
			return false;
		}

		try {
			$this->getDefaultAdapter()->beginTransaction();
			// Busca o novo codigo da proposta
			$idEndosso = $Proposta->id_endosso;

			// Duplica a proposta
			$Endosso = $this->copiarProposta($Proposta, $idEndosso);
			if (!$Endosso) {
				$this->setMessage('Não foi possível copiar os dados da proposta.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}
			
			/* 
			 * Trecho especial para criação automática de parcela de restituição de subvenção
			 * e parcela de cobrança da subvenção para o segurado
			 */
			if($flLote == true){
				
				if(!$nrParcelas){
					$nrParcelas = 1;
				}
				
				$rsTotalSubvencao = $this->_db->fetchOne('select sum(vl_subvencao_estadual) from seguro.propostas_parcelas where id_proposta in  (select id from seguro.propostas where id_status=8 and id_endosso='.$Proposta->id_endosso.')');
				
				$arDtVencimento    = array();

				$dt = new DateTime();
				$dt->modify('+10 day');
				
				if($nrParcelas == 1){
					$vlParcelaSubvencao = $rsTotalSubvencao;
					
					$this->_db->insert('seguro.propostas_parcelas', array(
							'id_proposta'          => $Endosso->id,
							'nr_parcela'           => 1,
							'vl_subvencao_estadual'=> 0,
							'vl_segurado'          => $vlParcelaSubvencao,
							'vl_total'             => $vlParcelaSubvencao,
							'dt_vencimento'        => $dt->format('Y-m-d'),
							'id_usuario_criacao'   => $this->_user->id
					));		

					$this->_db->insert('seguro.propostas_parcelas', array(
							'id_proposta'          => $Endosso->id,
							'nr_parcela'           => 2,
							'vl_subvencao_estadual'=> ($rsTotalSubvencao * -1),
							'vl_segurado'          => 0,
							'vl_total'             => ($rsTotalSubvencao * -1),
							'dt_vencimento'        => $dt->format('Y-m-d'),
							'id_usuario_criacao'   => $this->_user->id
					));
					
				} else {
					$vlParcelaSubvencao = round(($rsTotalSubvencao / $nrParcelas), 2);
					$tmpValorSubvencao  = 0;
					
					for($i=1; $i<=$nrParcelas; $i++){
						
						if($i != $nrParcelas){
							
							$this->_db->insert('seguro.propostas_parcelas', array(
									'id_proposta'          => $Endosso->id,
									'nr_parcela'           => $i,
									'vl_subvencao_estadual'=> 0,
									'vl_segurado'          => $vlParcelaSubvencao,
									'vl_total'             => $vlParcelaSubvencao,
									'dt_vencimento'        => $dt->format('Y-m-d'),
									'id_usuario_criacao'   => $this->_user->id
							));
							
							$tmpValorSubvencao += $vlParcelaSubvencao;
					
						} else {
							$difSubvencao = ($rsTotalSubvencao - $tmpValorSubvencao);
							
							$this->_db->insert('seguro.propostas_parcelas', array(
									'id_proposta'          => $Endosso->id,
									'nr_parcela'           => $i,
									'vl_subvencao_estadual'=> 0,
									'vl_segurado'          => ($difSubvencao),
									'vl_total'             => ($difSubvencao),
									'dt_vencimento'        => $dt->format('Y-m-d'),
									'id_usuario_criacao'   => $this->_user->id
							));							
						}

						$dt->modify('+1 month');
					}		

					$dt->modify('-1 month'); //para data ficar a última do loop

					$this->_db->insert('seguro.propostas_parcelas', array(
							'id_proposta'          => $Endosso->id,
							'nr_parcela'           => $i,
							'vl_subvencao_estadual'=> ($rsTotalSubvencao * -1),
							'vl_segurado'          => 0,
							'vl_total'             => ($rsTotalSubvencao * -1),
							'dt_vencimento'        => $dt->format('Y-m-d'),
							'id_usuario_criacao'   => $this->_user->id
					));					
				}
				
				$PropostaEndosso = new Endosso_Model_Propostas();
				$PropostaEndosso->changeStatus(array('id_proposta' => $Endosso->id), 'ORCAMENTO_ENDOSSO');
				$PropostaEndosso->getAdapter()->delete('seguro.propostas_endosso_opcoes', "id_proposta = {$Endosso->id}");
				$PropostaEndosso->getAdapter()->insert('seguro.propostas_endosso_opcoes', array(
						'id_proposta'        => $Endosso->id,
						'id_endosso_opcao'   => '1',
						'id_usuario_criacao' => $this->_user->id
				));				
			}
			/* 
			 * Fim trecho especial para criação automática de parcelas
			 */
				
			
			// Copia informações para tabela Proposta_Endosso
			$this->_db->insert('seguro.propostas_endosso', array(
					'id_proposta' => $Endosso->id,
					'id_endosso'  => $Proposta->id_endosso,
					'id_usuario_criacao' => $this->_user->id
			));

			// Duplica os arquivos
			if (!$this->copiarDados($Endosso->id, $Proposta->arquivos(), new Endosso_Model_Proposta_Arquivos())) {
				$this->setMessage('Não foi possível copiar os arquivos.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica os atributos
			if (!$this->copiarDados($Endosso->id, $Proposta->atributos(), new Endosso_Model_Proposta_Atributos())) {
				$this->setMessage('Não foi possível copiar os atributos.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica os beneficiarios
			if (!$this->copiarDados($Endosso->id, $Proposta->beneficiarios(), new Endosso_Model_Proposta_Beneficiarios())) {
				$this->setMessage('Não foi possível copiar os dados dos beneficiários.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica Pessoa Autorizada a Acompanhar Vistoria
			if (!$this->copiarDados($Endosso->id, $Proposta->pessoa_autorizada(), new Endosso_Model_Proposta_PessoasAutorizadas())) {
				$this->setMessage('Não foi possível copiar os dados das pessoas autorizadas.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica as coberturas
			if (!$this->copiarDados($Endosso->id, $Proposta->coberturas(), new Endosso_Model_Proposta_Coberturas())) {
				$this->setMessage('Não foi possível copiar as coberturas.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica os locais de entrega de sementes
			if (!empty(array_intersect(array(33,40, 45),array_keys($Proposta->coberturas_contratadas('adicional'))))) {

				$PropostaCooperativas = new Seguro_Model_PropostasCooperativas();

				if (!$this->copiarDados($Endosso->id, $PropostaCooperativas->getByIdProposta($Proposta->id)->toArray(), $PropostaCooperativas)) {
					$this->setMessage(('Não foi possível copiar locais de entrega de sementes.'));
					$this->getDefaultAdapter()->rollBack();
					return false;
				}
			}

			// Duplica o corretor
			if (!$this->copiarDados($Endosso->id, $Proposta->corretor(), new Endosso_Model_Proposta_Corretores())) {
				$this->setMessage('Não foi possível copiar os dados do corretor.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica as observacoes
			if (!$this->copiarDados($Endosso->id, $Proposta->observacoes(), new Endosso_Model_Proposta_Observacoes())) {
				$this->setMessage('Não foi possível copiar as observações.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

/* 			if($flLote == true){
				$arObs = $Proposta->observacoes();
				$stObs = $arObs[0]['ds_observacao']." \n\r Endosso de cobrança do valor correspondente ao subsídio estadual, em virtude da não concessão deste benefício ao segurado.";

				$this->_db->update('seguro.propostas_observacoes', array('ds_observacao' => $stObs), "fl_principal=true and id_proposta = {$Endosso->id}");
			}
 */
			/* Duplica as parcelas
			if (!$this->copiarDados($Endosso->id, $Proposta->parcelas(), new Endosso_Model_Proposta_Parcelas())) {
				$this->setMessage('Não foi possível copiar as parcelas.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}
			*/

			// Duplica o proponente
			if (!$this->copiarDados($Endosso->id, $Proposta->proponente(), new Endosso_Model_Proposta_Proponentes())) {
				$this->setMessage('Não foi possível copiar o proponente.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}
			
			// Duplica o proponente
			if (!$this->copiarDados($Endosso->id, $Proposta->proponente_ppe(), new Endosso_Model_Proposta_Ppe())) {
				$this->setMessage('Não foi possível copiar o proponente.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica a propriedade
			if (!$this->copiarDados($Endosso->id, $Proposta->propriedade(), new Endosso_Model_Proposta_Propriedades())) {
				$this->setMessage('Não foi possível copiar a propriedade.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica os questionarios
			if (!$this->copiarDados($Endosso->id, $Proposta->questionarios(), new Endosso_Model_Proposta_Questionarios())) {
				$this->setMessage('Não foi possível copiar o questionário.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica os itens segurados
			if (!$this->copiarItensSegurados($Endosso->id, $Proposta->quadras(), new Endosso_Model_Proposta_Quadras())) {
				$this->setMessage('Não foi possível copiar os itens segurados.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica os tipos de assinaturas
			if (!$this->copiarDados($Endosso->id, $Proposta->propostas_tipo_assinatura_documento(), new Seguro_Model_PropostasTipoAssinaturaDocumento())) {
				$this->setMessage('Não foi possível copiar os tipos de assinaturas.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Dados bancários
			if (
				!$this->copiarDados($Endosso->id, $Proposta->seguro_informacoes_bancarias(), new Seguro_Model_InformacoesBancarias())
				|| !$this->copiarDados($Endosso->id, $Proposta->sistema_informacoes_bancarias(), new Sistema_Model_InformacoesBancarias())
				|| !$this->copiarDados($Endosso->id, $Proposta->seguro_informacoes_bancarias_propostas(), new Seguro_Model_InformacoesBancariasPropostas())
			) {
				$this->setMessage('Não foi possível copiar os dados bancários.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica os e-mails de assinaturas de documentos
			if (!$this->copiarDados($Endosso->id, $Proposta->propostas_email_assinatura_documento(), new Seguro_Model_PropostasEmailAssinaturaDocumento())) {
				$this->setMessage('Não foi possível copiar os e-mails de assinaturas de documentos.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica a justificativa do e-mail do segurado ser o mesmo do corretor
			if (!$this->copiarDados($Endosso->id, $Proposta->propostas_email_justificativa(), new Seguro_Model_PropostasEmailJustificativa())) {
				$this->setMessage('Não foi possível copiar a justificativa do preenchimento do e-mail do segurado com o e-mail do corretor.');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

			// Duplica o croqui georreferenciado
			// Feito de forma de diferente pois possui duas tabelas (especialização)
			$CroquiGeo = new Seguro_Model_PropostasCroquis();
			if (!$CroquiGeo->copiaCroquiGeo($Proposta->id, $Endosso->id)) {
				$this->setMessage('Não foi possível copiar o croqui georreferenciado');
				$this->getDefaultAdapter()->rollBack();
				return false;
			}

            if ($importarItensLaudo) {
                if (!$this->atualizarUnidadesSeguradasLaudo($Endosso->id)) {
                    $this->getDefaultAdapter()->rollBack();
                    return false;
                }
            }

			$this->getDefaultAdapter()->commit();
			return $Endosso->id;
		} catch (Exception $e) {
			$this->getDefaultAdapter()->rollBack();
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	/**
	 * Copia os dados principais da proposta
	 *
	 * @param $idProposta
	 */
	private function copiarProposta($Proposta, $idEndosso) {
		if ($idEndosso) {
			$Endossos = new Endosso_Model_Proposta_Endossos();
			$Row = $this->createRow();

			$vigencia_original = strtotime(Agro_Util::formatDate($Proposta->dt_vigencia_inicio, Zend_Date::W3C));
			$vigencia_hoje = strtotime(Agro_Util::formatDate(date('Y-m-d h:i:s'), Zend_Date::W3C));
			
			$Row->id_usuario_criacao 			= $Proposta->id_usuario_criacao;
			$Row->nr_digito_verificador 		= Agro_Util::verificador($idEndosso);
			$Row->id_proposta_renovada			= $Proposta->id_proposta_renovada;
			$Row->dt_vigencia_inicio    		= ($vigencia_original > $vigencia_hoje) ? $Proposta->dt_vigencia_inicio : date('Y-m-d h:i:s');
			
			$Row->dt_vigencia_fim 				= $Proposta->dt_vigencia_fim;
			$Row->dt_transmissao 				= $Proposta->dt_transmissao;
			$Row->nr_apolice 					= $Proposta->nr_apolice;
			$Row->id_produto 					= $Proposta->id_produto;
			$Row->id_status 					= $Proposta->getStatus('ENDOSSO_INCOMPLETO', 'PR');
			$Row->vl_custo_apolice 				= $Proposta->vl_custo_apolice;
			$Row->vl_comissao 					= $Proposta->vl_comissao;
			$Row->ds_status_seguradora 			= $Proposta->ds_status_seguradora;
			$Row->vl_comissao 					= $Proposta->vl_comissao;
			$Row->ds_status_seguradora 			= $Proposta->ds_status_seguradora;
			$Row->ds_identificador_seguradora 	= $Proposta->ds_identificador_seguradora;
			$Row->ds_classe 					= $Proposta->ds_classe;
			$Row->id_secao  					= $Proposta->id_secao;
			$Row->id_proposta_endossada			= $Proposta->id;
			$Row->id_proposta_mae				= $Proposta->id_proposta_mae($Proposta->id); 
			$Row->id_endosso					= $idEndosso;
			$Row->save();

 			$this->getDefaultAdapter()->insert('sumario.itens_segurados', array(
					'id_proposta' => $Row->id,
					'vl_area' => 0,
					'vl_lmga' => 0,
 					'id_usuario_criacao' => Zend_Auth::getInstance()->getIdentity()->id
			));

 			$Propostas = new Seguro_Model_Propostas();
 			$Propostas->gera_versao($Row->id);

			return $Row;
		} else {
			throw new Exception('Nenhum endosso informado.');
		}
	}

	/**
	 * Verifica se existe um endosso para a proposta
	 *
	 * @param integer $idProposta
	 */
	private function _verificaEndosso($Proposta) {
		return $this->getAdapter()->fetchOne("select p.id from seguro.propostas p inner join sistema.status s on p.id_status = s.id where p.id_endosso = {$Proposta->id_endosso} and s.ds_chave = 'ORCAMENTO_ENDOSSO'");
	}

	/**
	 * Copiar dados da proposta
	 *
	 * @param $idProposta
	 */
	private function copiarDados($idEndosso, $Rs, $Model) {
		try {
			if (count($Rs)) {
				foreach ($Rs as $row) {
					$Model->add($idEndosso, $row);
				}
			}

			return true;
		} catch (Exception $e) {
			die($e);
			return false;
		}
	}


	public function idPropostaEndossada() {
		return $this->id_endosso;
	}

    private function atualizarUnidadesSeguradasLaudo(int $idEndosso) : bool
    {
        $modelVP = new Seguro_Model_VistoriaPreviaEmpresa;
        $rowProposta = (new Endosso_Model_Propostas())->find($idEndosso)->current();
        $idPropostaEndossada = $rowProposta->id_proposta_endossada;
		$statusValidos = [
			Seguro_Model_VistoriaPrevia::ID_STATUS_VP_TRANSMITIDA,
			Seguro_Model_VistoriaPrevia::ID_STATUS_VP_TRANSMITIDA_SEM_FOTOS
		];

        $dadosVistoria = $modelVP->getDadosDigitacaoFinalizadaByIdProposta(
            $idPropostaEndossada,
            $statusValidos,
            true
        );

        if (!empty($dadosVistoria)) {
            $status_analise = $modelVP->getStatusAnalise($dadosVistoria['id']);

            if ((int)$status_analise !== Seguro_Model_VistoriaPrevia::ID_STATUS_VP_ANALISE_CONCLUIDA_CANC) {
                $dadosLaudo = $modelVP->getLaudo($dadosVistoria['id'], $idPropostaEndossada);
                $itensLaudo = $modelVP->getItensLaudoByProposta(array(
                    'module' => 'regulacao',
                    'controller' => 'lvp001',
                    'id_proposta' => $idPropostaEndossada,
                    'id_laudo' => $dadosLaudo['id'],
                    'fl_habilitar_nova_vistoria' => 'false'
                ));

                $deParaColunas = [
                    'nr_quadra' => 'IS_DESCRICAO_ITEM',
                    'id_variedade' => 'IS_VARIEDADES',
                    'ds_coordenadas' => 'IS_COORDENADAS_GEOGRAFICAS',
                    'dt_final_semeadura' => 'IS_DATA_SEMEADURA',
                    'negar_ciclo_anterior' => 'IS_PRIMEIRO_ANO_PLANTIO',
                    'tipo_semeadura' => 'IS_SISTEMA_PLANTIO',
                    'tipo_solo' => 'IS_TIPO_SOLO',
                    'vl_area_asseguravel' => 'IS_AREA',
                    'fl_rendimento_inferior' => '',
                ];

                $deParaTipoSemeadura = [
                    'D' => 1,
                    'C' => 2,
                    'AL' => 3,
                ];

                $dadosAtualizarUnidades = [];
                $buscarItensSeguradosPropostaVigente = false;
                $idPropostaVigente = null;

                foreach ($itensLaudo as $item) {
                    foreach ($item as $coluna => $valor) {
                        if (!array_key_exists($coluna, $deParaColunas)) {
                            continue;
                        }

                        if ($coluna === 'fl_rendimento_inferior') {
                            if ((bool)$valor === true) {
                                $dadosAtualizarUnidades[$item['nr_item_segurado']]['IS_PRODUTIVIDADE'] = $item['vl_rendimento_estimado'];
                            }

                            continue;
                        }

                        if ($coluna === 'tipo_semeadura') {
                            $dadosAtualizarUnidades[$item['nr_item_segurado']]['IS_SISTEMA_PLANTIO'] = $deParaTipoSemeadura[trim($valor)];
                            continue;
                        }

                        if ($coluna === 'negar_ciclo_anterior') {
                            $dadosAtualizarUnidades[$item['nr_item_segurado']]['IS_PRIMEIRO_ANO_PLANTIO'] = (bool)$valor === true ? '1' : '2';
                            continue;
                        }

                        if ($coluna === 'tipo_solo' && (int)$valor > 3) {
                            $deParaColunas['tipo_solo'] = 'IS_TIPO_SOLO_AD';
                        }

                        if (empty($item['fl_area_segurado']) || empty($item['fl_area_plantada'])) {
                            $buscarItensSeguradosPropostaVigente = true;
                        }

                        $dadosAtualizarUnidades[$item['nr_item_segurado']][$deParaColunas[$coluna]] = $valor;
                        $dadosAtualizarUnidades[$item['nr_item_segurado']]['FL_AREA_SEGURADO'] = $item['fl_area_segurado'];
                        $dadosAtualizarUnidades[$item['nr_item_segurado']]['FL_AREA_PLANTADA'] = $item['fl_area_plantada'];
                    }
                }

                if ($buscarItensSeguradosPropostaVigente) {
                    $idPropostaVigente = (new Endosso_Model_Propostas())->getPropostaVigente($idEndosso);
                }

                $modelItensSegurados = new Seguro_Model_ItensSegurados();

                foreach ($dadosAtualizarUnidades as $numeroItemSegurado => $dadosItens) {
                    if (empty($dadosItens['FL_AREA_SEGURADO']) || empty($dadosItens['FL_AREA_PLANTADA'])) {
                        $itensSeguradosPropostaVigente = $modelItensSegurados->getItensByPropostaDsItem(
                            (int)$idPropostaVigente,
                            $dadosItens['IS_DESCRICAO_ITEM']
                        );


                        if (!empty($itensSeguradosPropostaVigente)) {
                            $dadosItens['IS_VARIEDADES'] = $itensSeguradosPropostaVigente['id_variedade'];
                            $dadosItens['IS_COORDENADAS_GEOGRAFICAS'] = $itensSeguradosPropostaVigente['ds_coordenadas_geograficas'];
                            $dadosItens['IS_DATA_SEMEADURA'] = $itensSeguradosPropostaVigente['dt_semeadura'];
                            $dadosItens['IS_PRIMEIRO_ANO_PLANTIO'] = $itensSeguradosPropostaVigente['ds_primeiro_ano_plantio'];
                            $dadosItens['IS_SISTEMA_PLANTIO'] = $itensSeguradosPropostaVigente['id_sistema_plantio'];

                            if ((int)$itensSeguradosPropostaVigente['id_tipo_solo'] > 3) {
                                $dadosItens['IS_TIPO_SOLO_AD'] = $itensSeguradosPropostaVigente['id_tipo_solo'];
                            } else {
                                $dadosItens['IS_TIPO_SOLO'] = $itensSeguradosPropostaVigente['id_tipo_solo'];
                            }
                        } else {
                            /**
                             * Opção “Não está na lista (Inserir nas observações)” na digitação da vistoria
                             */
                            $dadosItens['IS_VARIEDADES'] = 6971;
                        }
                    }

                    $dadosItens['fl_importado_previa'] = true;

                    if (!$modelItensSegurados->save($numeroItemSegurado, $dadosItens, $idEndosso, true)) {
                        return false;
                    }
                }
            }
        }

        return true;
    }

    private function copiarItensSegurados(int $idEndosso, $rs, $model): bool
    {
        try {
            if (count($rs)) {
                $modelItensSeguradosCar = new Seguro_Model_ItensSeguradosCAR();

                foreach ($rs as $row) {
                    $novoIdItemSegurado = $model->add($idEndosso, $row);
                    $dadosItensSeguradosCarAtual = $modelItensSeguradosCar->fetchAll(
                        "id_item_segurado = {$row['id_item_segurado']}"
                    )->toArray();

					foreach ($dadosItensSeguradosCarAtual as $dados) {
                        $dados['id_item_segurado'] = $novoIdItemSegurado;
                        $modelItensSeguradosCar->save($dados);
					}
                }
            }

            return true;
        } catch (Exception $e) {
            return false;
        }
    }
}
