<?php

class Sinistro_Model_Row_LaudoPreliminar 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_preliminares'), array('id_vistoria'));
		$Select->where("id_laudo_preliminar = ?", $this->id);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function vistoriadores() {
		$Funcionarios = new Sistema_Model_Funcionarios();
		return $Funcionarios->getListVistoriadores($this->id_processo);
	}

	public function itensAtingidos() {
		$Config = $this->getAll();
		$model = ucfirst($Config['ds_chave'])."_Model_".ucfirst($Config['ds_controller']);

		$Model = new $model();
		return $Model->itensAtingidos($this->id);
	}

	public function areaAtingida() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('l' => 'sinistro.laudos_preliminares_itens_segurados'), null);
		$Select->join(array('i' => 'seguro.itens_segurados'), 'l.id_item_segurado = i.id', 'sum(vl_area)');
		$Select->where('l.id_laudo_preliminar = ?', $this->id);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function getAll() {
		try {
			$proposta = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow(
				$this->select()
					->setIntegrityCheck(false)
					->from(array('lp' => 'sinistro.laudos_preliminares'), false)
					->join(array('sp' => 'sinistro.processos'), 'sp.id = lp.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('lp.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('lp' => 'sinistro.laudos_preliminares'));
			$Select->join(array('pc' => 'sinistro.processos'), 'lp.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('plp' => 'produto.produtos_coberturas_laudo_preliminar'), 'plp.id_produto = pd.id AND plp.id_cobertura = lp.id_cobertura');
			$Select->where('pcconfig.id IN(?)', $idsConfiguracoesCoberturas);
			$Select->where('lp.id = ?', $this->id);

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
		} catch (Exception $e) {
			die($e->getMessage());
		}
	}

	public function getModelEspecializacao(){
		$sql = "SELECT
					sf.ds_chave as safra,
				    tlp.ds_chave as laudo
				FROM
					sinistro.laudos_preliminares 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_preliminar tlp on tlp.id  = pdc.id_tipo_laudo_preliminar
				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();
		$ModelEspecializacao 	= new $model();

		return $ModelEspecializacao->fetchRow("id_laudo_preliminar = {$this->id}");
	}



	public function itensSegurados(){
		try {
			$ModelIS = new Sinistro_Model_LaudosPreliminaresItensSegurados();
			return $ModelIS->fetchAll("id_laudo_preliminar={$this->id}");

		} catch (Exception $e) {
			throw new Exception($e->getMessage());
		}

	}

	public function itensSeguradosEspecializacao(){
		$ItensSegurados = $this->itensSegurados();

		$itens = array();

		foreach($ItensSegurados as $item){
			$itens[] = $item->id;
		}

		if($this->getModelEspecializacao()){
			$modelIS = $this->getModelEspecializacao()."ItensSegurados";

			try {
				$ModelEspecializacaoIS	= new $modelIS();
				return $ModelEspecializacaoIS->fetchAll("id_laudo_preliminar_item_segurado in (".implode(",", $itens).")");

			} 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();

			$ItensSegurados 		= $this->itensSegurados();

			foreach ($ItensSegurados as $Item){
				$id_item_segurado = $Item->id_item_segurado;
				break;
			}

			$Especializacao = $this->especializacao();

			if($id_item_segurado){
				$EspecializacaoIS = $this->itensSeguradosEspecializacao();
			}

			$LaudoPreliminarBackup 	= parent::duplicar(array("id_processo"=>$id_processo_backup,true));

			if($Especializacao){
				$EspecializacaoBackup 	= $Especializacao->duplicar(array("id_laudo_preliminar"=>$LaudoPreliminarBackup->id));
			}

			foreach ($ItensSegurados as $Item){
				$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_preliminares_itens_segurados_id_seq');");
				$ItemBackup = $Item->duplicar(array("id_laudo_preliminar" => $LaudoPreliminarBackup->id, "id_item_segurado" => $id_item_segurado, "id"=>$id));

				$excluirItem = $this->verificaIS($Item->id_item_segurado, $id_item_segurado);

				if ($EspecializacaoIS){
					foreach ($EspecializacaoIS as $IS){
						if ($Item->id == $IS->id_laudo_preliminar_item_segurado){
							$ISBackup = $IS->duplicar(array("id_laudo_preliminar_item_segurado"=>$ItemBackup->id));
						}
					}
				}

				if ($excluirItem){
					$ModelLpis = new Sinistro_Model_LaudosPreliminaresItensSegurados();
					$ModelLpis->delete($Item->id);
				}
			}

			return $LaudoPreliminarBackup;

		} catch (Exception $e) {
			die($e->getMessage());
			throw new Exception($e->getMessage());
		}
	}
}