<?php

class Sinistro_Model_Row_LaudoFinal extends Agro_Db_Table_Row_Abstract {

	public function processo() {
		$Processos = new Sinistro_Model_Processos();
		return $Processos->find($this->id_processo)->current();
	}

	public function vistoria() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('v' => 'sistema.vistorias_laudos_finais'), array('id_vistoria'));
		$Select->where("id_laudo_final = ?", $this->id);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function avisosRelacionados(){
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('v' => 'sistema.vistorias_laudos_finais'), array('id_vistoria'));
		$Select->where("id_laudo_final = ?", $this->id);

		$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);

		$vistorias = array();

		foreach ($Row as $vistoria){
			$vistorias[]=$vistoria["id_vistoria"];
		}

		$SelectAviso = $this->select()->setIntegrityCheck(false);
		$SelectAviso->from(array('v' => 'sinistro.vistorias_avisos'), array('id_aviso'));
		$SelectAviso->where("id_vistoria in (?)", implode(",", $vistorias));

		$RowAviso = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($SelectAviso);

		$avisos = array();
		foreach ($RowAviso as $aviso){
			$avisos[]=$aviso["id_aviso"];
		}

		return $avisos;
	}


	public function itensAtingidos() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('l' => 'sinistro.laudos_finais_itens_segurados'), array('vl_percent_colhido', 'vl_percent_perdas', 'id', 'id_motivo_quadra_nao_vistoriada'));
		$Select->join(array('i' => 'seguro.itens_segurados'), 'l.id_item_segurado = i.id', array('id as id_item_segurado', 'nr_item_segurado', 'ds_item_segurado', 'vl_area', 'vl_lmga'));
		$Select->join(array('v' => 'produto.variedades'), 'i.id_variedade = v.id', 'ds_nome_variedade');
		$Select->where('l.id_laudo_final = ?', $this->id);
		$Select->order('i.nr_item_segurado');

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function areaAtingida() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('l' => 'sinistro.laudos_finais_itens_segurados'), null);
		$Select->join(array('i' => 'seguro.itens_segurados'), 'l.id_item_segurado = i.id', 'sum(vl_area)');
		$Select->join(array('v' => 'produto.variedades'), 'i.id_variedade = v.id', null);
		$Select->where('l.id_laudo_final = ?', $this->id);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function importaItensLaudoPreliminar() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('lp'  => 'sinistro.laudos_preliminares'), null);
		$Select->join(array('lpi' => 'sinistro.laudos_preliminares_itens_segurados'), 'lp.id = lpi.id_laudo_preliminar', null);
		$Select->join(array('i'   => 'seguro.itens_segurados'), 'lpi.id_item_segurado = i.id', array('id as id_item_segurado', 'nr_item_segurado', 'ds_item_segurado', 'vl_area', 'vl_lmga'));
		$Select->join(array('v'   => 'produto.variedades'), 'i.id_variedade = v.id', 'ds_nome_variedade');
		$Select->joinLeft(array('lfi' => 'sinistro.laudos_finais_itens_segurados'), "i.id = lfi.id_item_segurado and lfi.id_laudo_final = {$this->id}", array('vl_percent_perdas', 'vl_percent_colhido', 'fl_nao_vistoriada', 'id_motivo_quadra_nao_vistoriada', 'id as id_laudo_final_item', 'id_laudo_final'));
		$Select->where('lp.id_cobertura = ?', $this->id_cobertura);
		$Select->where('lp.id_processo = ?', $this->id_processo);

		$Rs = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
		if (count($Rs)) {
			$LaudosFinaisItensSegurados = new Sinistro_Model_LaudosFinaisItensSegurados();
			$LaudosFinaisItensSegurados->clear($this->id);

			foreach ($Rs as $Row) {
				$LaudosFinaisItensSegurados->save(array(
					'id_laudo_final' => $this->id,
					'id_item_segurado' => $Row['id_item_segurado'],
					'vl_percent_perdas' => $Row['vl_percent_perdas'],
					'fl_nao_vistoriada' => $Row['fl_nao_vistoriada'],
					'id_motivo_quadra_nao_vistoriada' => $Row['id_motivo_quadra_nao_vistoriada'],
					'vl_percent_colhido' => $Row['vl_percent_colhido']
				));
			}
		}

		return $this->itensAtingidos();
	}

	public function getAll() {
		try {
			$proposta = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow(
				$this->select()
					->setIntegrityCheck(false)
					->from(array('lf' => 'sinistro.laudos_finais'), false)
					->join(array('sp' => 'sinistro.processos'), 'sp.id = lf.id_processo', false)
					->join(array('spr' => 'seguro.propostas'), 'spr.id = sp.id_proposta', 'id_produto')
					->join(array('sprmae' => 'seguro.propostas'), 'sprmae.id = spr.id_proposta_mae', 'sprmae.dt_transmissao, sprmae.id_produto')
					->where('lf.id = ?', $this->id)
			);
			
			$dateTime = DateTime::createFromFormat('Y-m-d H:i:s', $proposta['dt_transmissao']);

			$configuracoesCoberturas = (new Produto_Model_ProdutoCoberturaConfig())->getConfiguracoesPorProdutoData(
				$proposta['id_produto'],
				$dateTime
			);
			
			$idsConfiguracoesCoberturas = array_column($configuracoesCoberturas, 'id');
			
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('lf' => 'sinistro.laudos_finais'));
			$Select->join(array('pc' => 'sinistro.processos'), 'lf.id_processo = pc.id');
			$Select->join(array('pp' => 'seguro.propostas'), 'pc.id_proposta = pp.id');
			$Select->join(array('pd' => 'produto.produtos'), 'pp.id_produto = pd.id');
			$Select->join(array('pdc' => 'produto.produtos_coberturas'), 'pdc.id_produto = pd.id');

			$Select->join(
				array('pcconfig' => 'produto.produto_cobertura_config'),
				'pcconfig.id_produto = pdc.id_produto AND pcconfig.id_cobertura = pdc.id_cobertura',
				array('ds_frase_outros_riscos_excluidos', 'ds_frase_condicoes_particulares')
			);
			$Select->join(array('sf' => 'produto.safras'), 'pd.id_safra = sf.id');
			$Select->join(array('plf' => 'produto.produtos_coberturas_laudo_final'), 'plf.id_produto = pd.id AND plf.id_cobertura = lf.id_cobertura');
			$Select->where('lf.id = ?', $this->id);
			$Select->where('pcconfig.id IN (?)', $idsConfiguracoesCoberturas);
			
			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		} catch (Exception $e) {
			die($e->getMessage());
		}
	}

	public function countQuadras($table) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array("t"=>$table));
		$Select->where('t.id_laudo_final = ?', $this->id);

		return count(Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select));
	}

	public function getModelEspecializacao(){
		$sql = "SELECT
					sf.ds_chave as safra,
				    tlf.ds_chave as laudo
				FROM
					sinistro.laudos_finais AS lp INNER JOIN
				    sinistro.processos AS pc ON lp.id_processo = pc.id INNER JOIN
				    seguro.propostas AS pp ON pc.id_proposta = pp.id INNER JOIN
				    produto.produtos AS pd ON pp.id_produto = pd.id INNER JOIN
				    produto.produtos_coberturas AS pdc ON pdc.id_produto = pd.id INNER JOIN
				    produto.safras AS sf ON pd.id_safra = sf.id INNER JOIN
				    sinistro.tipo_laudo_final tlf on tlf.id  = pdc.id_tipo_laudo_final
				WHERE
					lp.id = {$this->id}
					and pdc.id_cobertura = {$this->id_cobertura};
		";

		$Row = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($sql);

		if ($Row){
			return ucfirst($Row["safra"])."_Model_".ucfirst(strtolower($Row["laudo"]));

		} else {
			return false;
		}
	}

	public function especializacao(){
		$model = $this->getModelEspecializacao();
		if ($model){
			$ModelEspecializacao = new $model();
			return $ModelEspecializacao->fetchRow("id_laudo_final = {$this->id}");
		} else {
			return false;
		}

	}

	public function itensSegurados(){
		$ModelIS = new Sinistro_Model_LaudosFinaisItensSegurados();
		return $ModelIS->fetchAll("id_laudo_final={$this->id}");
	}

	public function itensSeguradosVistoria(){
		$ModelIS = new Sistema_Model_VistoriasItensSegurados();
		return $ModelIS->fetchAll("id_vistoria={$this->vistoria()}");
	}

	public function itensSeguradosEspecializacao(){
		$ItensSegurados = $this->itensSegurados();

		$itens = array();

		foreach($ItensSegurados as $item){
			$itens[] = $item->id;
		}

		if($this->getModelEspecializacao()){
			$modelIS = $this->getModelEspecializacao()."ItensSegurados";

			if(count($itens) > 0){
				try {
					$ModelEspecializacaoIS	= new $modelIS();
					$rs = $ModelEspecializacaoIS->fetchAll("id_laudo_final_item_segurado in (".implode(",", $itens).")");
				} catch (Exception $e) {
					return false;
				}
			} else {
				return true;
			}

		} else {
			return false;

		}
	}

	public function itemSeguradoAmostras($id_laudo_final_item_segurado){
		if($this->getModelEspecializacao()){
			$modelItensSeguradosAmostras = $this->getModelEspecializacao()."ItensSeguradosAmostras";

			try {
				$ModelEspecializacaoISA	= new $modelItensSeguradosAmostras();
				return $ModelEspecializacaoISA->fetchAll("id_laudo_final_item_segurado = $id_laudo_final_item_segurado");

			} catch (Exception $e) {
				return false;
			}

		} else {
			return false;

		}
	}

	public function getItemSeguradoEndosso($id_item_segurado, $id_processo_backup){
		$ModelProcesso = new Sinistro_Model_Processos();
		$ModelIS = new Seguro_Model_ItensSegurados();

		$ProcessoVigente = $ModelProcesso->find($this->id_processo)->current();
		$Proposta = $ProcessoVigente->proposta();

		$ItensSegurados = $this->itensSegurados();

		$ItensSeguradosVigentes = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll("select * from seguro.itens_segurados where id_proposta=$ProcessoVigente->id_proposta");

		foreach ($ItensSegurados as $Item){
			$Temp = $ModelIS->getItemSeguradoById($Item->id_item_segurado);

			foreach ($ItensSeguradosVigentes as $itemVigente){

				if ($itemVigente["nr_item_segurado"] == $Temp["nr_item_segurado"]){
					return $itemVigente["id"];
				}
			}
		}

		throw new Exception("Item não encontrado");
	}

	public function verificaIS($is_novo, $is_backup){
		$Model = new Seguro_Model_ItensSegurados();

		$IS = $Model->find($is_novo)->current();
		$ISBakup = $Model->find($is_backup)->current();

		if ($IS->vl_area != $ISBakup->vl_area){
			return true;
		} else {
			return false;
		}
	}

	public function duplicar($id_processo_backup){

		try {
			$ModelProcesso 	= new Sinistro_Model_Processos();
			$ModelIS		= new Seguro_Model_ItensSegurados();

			$Processo 		= $ModelProcesso->find($this->id_processo)->current();
			$ProcessoBackup = $ModelProcesso->find($id_processo_backup)->current();

			$ItensSegurados 	     = $this->itensSegurados();
			$ItensSeguradosVistorias = $this->itensSeguradosVistoria();

			$Especializacao 	= $this->especializacao();
			$EspecializacaoIS 	= $this->itensSeguradosEspecializacao();

			$LaudoFinalBackup = parent::duplicar(array("id_processo"=>$id_processo_backup));

			if ($Especializacao){

				$EspecializacaoBackup = $Especializacao->duplicar(array("id_laudo_final"=>$LaudoFinalBackup->id));

				foreach ($ItensSegurados as $Item){

					foreach($ItensSeguradosVistorias as $ItemVistoria){
						if($ItemVistoria->id_item_segurado == $Item->id_item_segurado){
							$ItemVistoria->id_item_segurado = $this->getItemSeguradoEndosso($Item->id_item_segurado, $id_processo_backup);
							$ItemVistoria->save();
						}
					}

					$id_item_segurado = $Item->id_item_segurado;
					$Item->id_item_segurado = $this->getItemSeguradoEndosso($Item->id_item_segurado, $id_processo_backup);
					$Item->save();

					$id = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne("select nextval('sinistro.laudos_finais_itens_segurados_id_seq');");

					$ItemBackup = $Item->duplicar(array("id_laudo_final" => $LaudoFinalBackup->id, "id_item_segurado" => $id_item_segurado, "id"=>$id));

					$excluirItem = $this->verificaIS($Item->id_item_segurado, $id_item_segurado);

					if ($EspecializacaoIS){
						foreach ($EspecializacaoIS as $EspIS){
							if ($EspIS->id_laudo_final_item_segurado == $Item->id){
								$EspISBackup = $EspIS->duplicar(array("id_laudo_final_item_segurado"=>$id));
							}
						}

						$Amostras = $this->itemSeguradoAmostras($Item->id);
						if ($Amostras){
							foreach ($Amostras as $amostra){
								$AmostBkp = $amostra->duplicar(array("id_laudo_final_item_segurado"=>$id));
							}
						}
					}

					if ($excluirItem){
						$ModelLfis = new Sinistro_Model_LaudosFinaisItensSegurados();
						$ModelLfis->delete($Item->id_laudo_final, $Item->id_item_segurado);
					}
				}
				return $LaudoFinalBackup;

			}else {
				return false;

			}
		} catch (Exception $e) {
			throw new Exception("ROW LAUDO FINAL: ".$e->getMessage());
		}
	}

	/*
	 * Compara se a data da vistoria da IS passada como parâmetro é
	 * superior a 4 dias. Se ele for o primeiro IS retorna true caso contrário
	 * faz comparação com o mais antigo.
	 */
	public function verificaIntervaloVistoria($dt_vistoria){
		if ($this->itensSegurados()->count() > 0){
			$dt_vistoria_mais_antiga  = Zend_Db_Table::getDefaultAdapter()->fetchOne("SELECT MIN(dt_vistoria) as dt_vistoria FROM sinistro.laudos_finais_itens_segurados where id_laudo_final = $this->id");

			$DataVistoriaAntiga = new Zend_Date($dt_vistoria_mais_antiga);
			$DataVistoria = new Zend_Date($dt_vistoria);

			$DataVistoriaAntiga->addDay('4');

			if ($DataVistoriaAntiga->compare($DataVistoria)){
				return true;

			} else {
				return false;
			}

		} else {
			return true;
		}
	}
}