<?

class Sinistro2_Model_LaudosPreliminares extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Sinistro2_Model_Row_LaudoPreliminar';
	protected $_name = 'laudos_preliminares';
	protected $_schema = 'sinistro';
	public $_order = 'id_processo';
	protected $_primary = 'id';

    public function save($dados) {

        try {
            $Adapter = new Zend_File_Transfer_Adapter_Http();
            $Adapter->setDestination(PATH_LAUDOS);
			$Adapter->addValidator('Size', false, 2097152);
			$Adapter->getValidator('Size')->setMessage("Mensagem de erro teste.");
            $Adapter->addValidator('Extension', false, ['pdf']);
			
            $file = $Adapter->getFileInfo();
			$infoArquivo = pathinfo($file['ds_nome_laudo_fisico']['name']);
			
			if (preg_match('/[áéíóúàèìòùâêîôûãõçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕÇ@#$%&*()\[\]\{\}<>:;?\/°\.]/u',$infoArquivo['filename'])) {
                $mensagemErro = "Nome de arquivo de laudo digitalizado inválido. Arquivo [ {$file['ds_nome_laudo_fisico']['name']} ] possui caracteres especiais.";
                $this->setMessage($mensagemErro);
                return false;
			} 
            if(array_key_exists('id_laudo_preliminar', $dados)) {
                $dados['id'] = $dados['id_laudo_preliminar'];
            }

            $Row = $this->getRow($dados['id']);

            $Row->id_processo    = $dados['id_processo'] ? $dados['id_processo'] : null;
            $Row->id_cobertura   = $dados['id_cobertura'] ? $dados['id_cobertura'] : null;
            $Row->ds_observacao  = $dados['ds_observacao'] ? $dados['ds_observacao'] : null;
            $Row->ds_coordenadas = $dados['ds_coordenadas'] ? $dados['ds_coordenadas'] : null;
           	$Row->fl_assinatura_regulador   = (array_key_exists('fl_assinatura_regulador', $dados) ? ($dados['fl_assinatura_regulador'] ? 1 : 0) : 0);
           	$Row->fl_assinatura_segurado    = (array_key_exists('fl_assinatura_segurado', $dados) ? $dados['fl_assinatura_segurado'] : 0);
           	$Row->fl_dt_evento_em_cobertura = (array_key_exists('fl_dt_evento_em_cobertura', $dados) ? $dados['fl_dt_evento_em_cobertura'] : 0);
           	$Row->fl_evento_nao_constatado  = ($dados['fl_evento_nao_constatado'] ? 1 : 0);
           	$Row->id_status = $dados['id_status'] ?? $this->getIdStatus('PENDENTE_ENVIO', 'LAUDOS_PRELIMINARES');

            if($dados['dt_vistoria_data']){
            	$Row->dt_vistoria = Agro_Util::formatDate($dados['dt_vistoria_data'].' '.$dados['dt_vistoria_hora'].' '.$dados['dt_vistoria_minutos'], "yyyy-MM-dd HH:mm");
            }
                        
            if($dados['fl_area_atingida']) {
                if(count($dados['itens_segurados_selecionados']) > 0) {
                    if ($this->isAreaParcial($dados['id_proposta'], $dados['itens_segurados_selecionados'])) {
                        $dados['fl_area_atingida'] = 'P';
                    } else {
                        $dados['fl_area_atingida'] = 'T';
                    }
                }
                $Row->fl_area_atingida = $dados['fl_area_atingida'];
            }

            if ($file["ds_nome_laudo_fisico"]["name"]){
                if ($dados['fl_evento_nao_constatado'] == "0"){
                    $newName = $this->geraNomeArquivoFisico($Row, $file["ds_nome_laudo_fisico"]["name"], $dados);
                } else {
                    $newName = $this->geraNomeArquivoFisicoEventoNaoConstatado($Row, $file["ds_nome_laudo_fisico"]["name"], $dados);
                }
                
                $Adapter->addFilter('Rename', array('target' => PATH_LAUDOS."/".$newName, 'overwrite' => true));
                if ($Adapter->isValid()) {
	                if ($Adapter->receive($file["ds_nome_laudo_fisico"]["name"])){
	                    $Row->ds_nome_laudo_fisico = $newName;
	                }else{
	                    $this->setMessage("Não foi possível salvar o laudo preliminar.<br>Erro: ".implode(";",$Adapter->getErrors()));
	                    return false;
	                }
                } else {
                    $mensagemErro = "Não foi possível salvar o Laudo pois o arquivo excede o limite máximo permitido (2Mb).";
							
                    $erros = $Adapter->getErrors();
                    if ($erros[0] == "fileExtensionFalse") {
                        $mensagemErro = "Formato de arquivo inválido (formato aceito: PDF).";	
                    }

                    $this->setMessage($mensagemErro);
                	return false;
                }
            }
            
            $idLaudoPreliminar = $Row->save();

            if($dados['id_vistoria']) {
                $VistoriasLaudosPreliminares = new Sistema_Model_VistoriasLaudosPreliminares();
                $Vistoria = $VistoriasLaudosPreliminares->save(array('id_vistoria'=>$dados['id_vistoria'],'id_laudo_preliminar'=>$idLaudoPreliminar));

                //atualiza a data da vistoria em sistema.vistorias, para ser usada no relatório de cobrança
                $Vistorias = new Sistema_Model_Vistorias();
                $Vistorias->save(array('id'=>$dados['id_vistoria'], 'dt_inicio' => $dados['dt_vistoria_data']));

                if(REGULACAO_ATIVA == 'N') {
	                // Relaciona vistoria com avisos
	                $Model_VistoriaAvisos = new Sinistro2_Model_VistoriasAvisos();
	                $dtVistoria = new Zend_Date($dados['dt_vistoria_data'].' '.$dados['dt_vistoria_hora'].':'.$dados['dt_vistoria_minutos'], 'dd/MM/yyyy HH:mm');
	
	                if (!$Model_VistoriaAvisos->setVistoriaPreliminarAvisos($dados['id_proposta'], $dados['id_vistoria'], $dtVistoria->toString('yyyy-MM-dd HH:mm'), $dados['id_cobertura'])){
	                	$this->setMessage($Model_VistoriaAvisos->getMessages());
	                }
                }

                if (array_key_exists('vistoriadores', $dados)) {
                     $Model_VistoriasFuncionarios = new Sistema_Model_VistoriasFuncionarios();
                     $Model_VistoriasFuncionarios->delete($dados['id_vistoria']);

                     if (is_array($dados['vistoriadores'])) {
                         foreach ($dados['vistoriadores'] as $idFuncionario) {
                            $Model_VistoriasFuncionarios->insert(
                                array(
                                    'id_vistoria'=>$dados['id_vistoria'],
                                    'id_funcionario'=>$idFuncionario
                                )
                            );
                         }
                     }
                }

                if (array_key_exists('auxiliares', $dados)) {
                    $Model_VistoriasFuncionarios = new Sistema_Model_VistoriasFuncionarios();
                    
                    if (is_array($dados['auxiliares'])) {
                        foreach ($dados['auxiliares'] as $idFuncionario) {
                            $Model_VistoriasFuncionarios->insert(
                                array(
                                    'id_vistoria' => $dados['id_vistoria'],
                                    'id_funcionario' => $idFuncionario
                                )
                            );
                        }
                    }
                }

            }

            $acao = empty($dados['Devolver'])
                ? Log_Model_LaudosPreliminaresHistorico::ACAO_SALVAR
                : Log_Model_LaudosPreliminaresHistorico::ACAO_DEVOLVER;

            (new Sinistro2_Service_LaudosPreliminaresHistorico(new Log_Model_LaudosPreliminaresHistorico()))
                ->salvarHistorico($idLaudoPreliminar, $acao);

            return $idLaudoPreliminar;

        } catch (Exception $e) {
        	$this->setMessage($e->getMessage().'<br><pre>'.$e->getTraceAsString().'</pre>');
            return false;
        }
    }

    public function novoLaudo($dados) {
    	 
    	try {
    		$Row = $this->getRow($dados['id']);
    
    		$Row->id_processo    = $dados['id_processo'] ? $dados['id_processo'] : null;
    		$Row->id_cobertura   = $dados['id_cobertura'] ? $dados['id_cobertura'] : null;
    		$Row->ds_observacao  = $dados['ds_observacao'] ? $dados['ds_observacao'] : null;
    		$Row->ds_coordenadas = $dados['ds_coordenadas'] ? $dados['ds_coordenadas'] : null;
    		$Row->id_status      = $dados['id_status'] ? $dados['id_status'] : $this->getIdStatus('PENDENTE_LAUDO_PRELIMINAR', 'LAUDOS_PRELIMINARES');
    		$idLaudoPreliminar = $Row->save();
    		    
    		if($dados['id_vistoria'] ) {
    			$VistoriasLaudosPreliminares = new Sistema_Model_VistoriasLaudosPreliminares();
    			$Vistoria = $VistoriasLaudosPreliminares->save(array('id_vistoria'=>$dados['id_vistoria'], 'id_laudo_preliminar'=>$idLaudoPreliminar));
    		}
    		
    		return $idLaudoPreliminar;
    
    	} catch (Exception $e) {
    		$this->setMessage($e->getMessage().'<br><pre>'.$e->getTraceAsString().'</pre>');
    		return false;
    	}
    }
        
    public function isAreaParcial($idProposta, array $ItensSeguradosAtingidos) {

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(
            array(
                'iseg'=>'seguro.itens_segurados'
            ),
            'count(id)'
        );
        $select->where('iseg.id_proposta = ?', $idProposta);
        $select->where('iseg.vl_lmga > 0');

        $countItensComLMGA = $this->_db->fetchOne($select);

        if(count($ItensSeguradosAtingidos) < $countItensComLMGA) {
            return true;
        } else {
            return false;
        }
    }

	public function getLaudosPreliminaresByAviso(int $idVistoria)
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct(true);
        $select->from(array('lp'=>'sinistro.laudos_preliminares'),'lp.id');
        $select->join(array('vl'=>'sistema.vistorias_laudos_preliminares'),'lp.id = vl.id_laudo_preliminar',false);
        $select->join(array('va'=>'sinistro.vistorias_avisos'),'vl.id_vistoria = va.id_vistoria', false);
        $select->where(
            "va.id_aviso in (select id_aviso from sinistro.vistorias_avisos where id_vistoria={$idVistoria})"
        );

		return $this->_db->fetchOne($select);
	}

	public function getIdStatusLP($ds_chave_status) {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('s'=>'sistema.status'),'id');
        $select->join(array('ts'=>'sistema.tipo_status'),'ts.id = s.id_tipo_status and ts.ds_chave = \'LAUDOS_PRELIMINARES\'', false);
        $select->WHERE('s.ds_chave = ?', $ds_chave_status);
        return $this->fetchRow($select)->id;
	}

    public function getIdLaudoPreliminarByVistoria($idVistoria) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(
            array(
            	'vlp'=>'sistema.vistorias_laudos_preliminares'
            ),
            'id_laudo_preliminar'
        );
        $select->where('vlp.id_vistoria = ?', $idVistoria);

        return $this->_db->fetchOne($select);
    }

    public function getLaudoPreliminar($idLaudoPreliminar) {

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(
            array(
                'lp'=>'sinistro.laudos_preliminares'
            ),
            array(
                'id as id_laudo_preliminar',
                'id_processo',
                'id_cobertura',
                'fl_assinatura_regulador',
                'fl_assinatura_segurado',
                'fl_evento_nao_constatado',
                'fl_area_atingida',
                'id_status',
                'ds_observacao',
                'ds_coordenadas',
                'dt_vistoria',
                'fl_dt_evento_em_cobertura',
                "to_char(dt_vistoria, 'dd/mm/yyyy') as dt_vistoria_data",
                "to_char(dt_vistoria, 'HH24') as dt_vistoria_hora",
                "to_char(dt_vistoria, 'MI') as dt_vistoria_minutos"
            )
        );
        $select->join(
            array(
                'st'=>'sistema.status'
            ),
            'st.id = lp.id_status',
            array(
                'ds_status',
                'cd_status',
                'ds_chave as ds_chave_status'
            )
        );
        $select->join(
            array(
                'sp'=>'sinistro.processos'
            ),
            'sp.id = lp.id_processo',
            array(
                'id_proposta'
            )
        );
        $select->join(
            array(
                'vlp'=>'sistema.vistorias_laudos_preliminares'
            ),
            'vlp.id_laudo_preliminar = lp.id',
            array(
                'id_vistoria'
            )
        );

        if ($this->_request['controller'] == 'lp004') {
            $select->joinLeft(
                array(
                    'lpe'=>strtolower($this->_request['module']).'.'.strtolower($this->_request['controller'])
                ),
                'lpe.id_laudo_preliminar = lp.id',
                array('ds_aspectos_gerais_cultura','fl_areas_declaradas_conferem','fl_lavoura_condiz_proposta',
                    "to_char(dt_prevista_inicio_colheita, 'dd/mm/yyyy') as dt_prevista_inicio_colheita", 'fl_incidencia_atingida')
            );
        } else {
            $select->joinLeft(
                array(
                    'lpe'=>strtolower($this->_request['module']).'.'.strtolower($this->_request['controller'])
                ),
                'lpe.id_laudo_preliminar = lp.id',
                '*'
            );
        }

        $select->where('lp.id = ?',$idLaudoPreliminar);

        $dataLaudo = $this->fetchRow($select)->toArray();

        $Model_VistoriasFuncionarios = new Sistema_Model_VistoriasFuncionarios();

        $vistoriadores = $Model_VistoriasFuncionarios->getArrayVistoriadoresByIDLaudoPreliminar($idLaudoPreliminar);

        if(count($vistoriadores) > 0) {
            $dataLaudo['vistoriadores'] = $vistoriadores;
        }

        $auxiliares = $Model_VistoriasFuncionarios->getArrayVistoriadoresByIDLaudoPreliminar($idLaudoPreliminar, true);

        if(count($auxiliares) > 0) {
            $dataLaudo['auxiliares'] = $auxiliares;
        }

        return $dataLaudo;
    }

    public function deleteEventoNaoConstatado($idLaudoPreliminar, $dados) {
    	$Model_LaudosPreliminaresItensSegurados = new Sinistro2_Model_LaudosPreliminaresItensSegurados();
        $Model_LaudosPreliminaresItensSegurados->deleteItensbyLaudoPreliminar($idLaudoPreliminar);

    	$Model_VistoriasItensSegurados = new Sistema_Model_VistoriasItensSegurados();
        $Model_VistoriasItensSegurados->delete($dados['id_vistoria']);

        return true;
    }

    public function getItensSeguradosByProposta ($idProposta, array $ItensSegurados = null, $idLaudoPreliminar = null) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('iseg'=>'seguro.itens_segurados'), array('id as id_item_segurado', 'nr_item_segurado', 'ds_item_segurado', 'vl_area'));
        $select->join(array('v'=>'produto.variedades'), 'v.id = iseg.id_variedade', 'ds_nome_variedade');

        if ($idLaudoPreliminar) {
            $select->join(array('lpis'=>'sinistro.laudos_preliminares_itens_segurados'), 'lpis.id_item_segurado = iseg.id', '*');
            $select->join(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id = '.$idLaudoPreliminar, null);

            //subselect para o caso de haver mais de um laudo preliminar, mostrar os itens referentes só ao seu devido laudo
            $select->where('lpis.id NOT IN (SELECT lpis.id FROM sinistro.laudos_preliminares_itens_segurados lpis
            								INNER JOIN sinistro.laudos_preliminares lp ON lp.id = lpis.id_laudo_preliminar
            								WHERE lp.id != '.$idLaudoPreliminar.')');

        }

        $select->where('iseg.id_proposta = ?', $idProposta);
        $select->where('iseg.vl_lmga > 0');
        
        //if ($ItensSegurados) {
            //$select->where('iseg.id in ('.implode(',', $ItensSegurados).')');
        //}

        $select->order(array('iseg.nr_item_segurado'));

        return $this->fetchAll($select);
    }

    public function getInformacoesProposta ($idProposta) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pr'=>'seguro.propostas'), null);
        $select->join(array('pd'=>'produto.produtos'), 'pd.id = pr.id_produto', null);
        $select->join(array('pg'=>'produto.produtos_geral'), 'pg.id = pd.id_produto_geral', 'id_cultura');
        $select->where('pr.id = ?', $idProposta);

        return $this->_db->fetchRow($select);
    }

    public function getItenSeguradosParcial($idProposta, $idVistoria) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('iseg'=>'seguro.itens_segurados'),array('id as id_item_segurado','nr_item_segurado','ds_item_segurado','vl_area','vl_lmga'));
        $select->joinLeft(array('vis'=>'sistema.vistorias_itens_segurados'),'vis.id_item_segurado = iseg.id and id_vistoria = '.$idVistoria,array('id_vistoria'));
        $select->join(array('v'=>'produto.variedades'),'v.id = iseg.id_variedade',array('ds_nome_variedade'));
        $select->where('iseg.id_proposta = ?', $idProposta);
        $select->where('iseg.vl_lmga > 0');

        $select->order('iseg.nr_item_segurado');

        return $this->_db->fetchAll($select);
    }

    public function getLaudoEscaneado($idLaudoPreliminar) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('lp' => 'sinistro.laudos_preliminares'), 'ds_nome_laudo_fisico');
        $select->where('lp.id = ?', $idLaudoPreliminar);

        $result = $this->_db->fetchOne($select);
        
        if(count(result)){
        	return $result;
        }else{
        	return false;
        }
    }

    public function geraNomeArquivoFisico($Row, $nome_arquivo_original, $params){

        if ($Row->ds_nome_laudo_fisico){
            $nome = explode(".", $Row->ds_nome_laudo_fisico);
            $nome = $nome[0];

            $extensao = pathinfo($nome_arquivo_original,PATHINFO_EXTENSION);
            return $nome.".".$extensao;
        }else{
            $LP = $this->find($Row->id)->current();

            $count = count($this->contaLaudosByProcesso($params['id_processo']));
            $count++;

            $extensao = pathinfo($nome_arquivo_original,PATHINFO_EXTENSION);
            $idPropostaMae = null;

            if (!empty($params['id_processo'])) {
                $Processos = new Sinistro2_Model_Processos();
                $idPropostaMae = $Processos->getPropostaMaeByProcesso($params['id_processo']);
            }

            $idProposta = !empty($idPropostaMae) ? $idPropostaMae : $params['id_proposta'];
            return strtoupper(str_pad($idProposta, 6, "0", STR_PAD_LEFT)."_VL_".str_pad($count, 3, "0", STR_PAD_LEFT).".".$extensao);
        }
    }

    public function contaLaudosByProcesso($idProcesso){
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pro' => 'sinistro.processos'), false);
        $select->join(array('lp' => 'sinistro.laudos_preliminares'), 'pro.id = lp.id_processo', 'id');
        $select->where('pro.id = ?', $idProcesso);

        return $this->_db->fetchAll($select);
    }

    public function geraNomeArquivoFisicoEventoNaoConstatado($Row, $nome_arquivo_original, $params){

        if ($Row->ds_nome_laudo_fisico){
            $nome = explode(".", $Row->ds_nome_laudo_fisico);
            $nome = $nome[0];

            $extensao = pathinfo($nome_arquivo_original, PATHINFO_EXTENSION);
            return $nome.".".$extensao;
        }else{
            $count = count($this->contaLaudosByProcesso($params['id_processo']));
            $count++;

            $extensao = pathinfo($nome_arquivo_original, PATHINFO_EXTENSION);
            $idPropostaMae = null;

            if (!empty($params['id_processo'])) {
                $Processos = new Sinistro2_Model_Processos();
                $idPropostaMae = $Processos->getPropostaMaeByProcesso($params['id_processo']);
            }

            $idProposta = !empty($idPropostaMae) ? $idPropostaMae : $params['id_proposta'];

            return strtoupper(str_pad($idProposta, 6, "0", STR_PAD_LEFT)."_VL_".str_pad($count, 3, "0", STR_PAD_LEFT)."EV_N_CONST.".$extensao);
        }
    }

    public function deleteArquivo($idLaudoPreliminar){
        $Row = $this->getRow($idLaudoPreliminar);
        Agro_File::delete(PATH_LAUDOS, $Row->ds_nome_laudo_fisico);

        $Row->ds_nome_laudo_fisico = null;
        $Row->save();
    }

    public function getLaudoPreliminarByVistoria(int $idVistoria)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['lp' => "{$this->_schema}.{$this->_name}"], ['id', 'id_status']);
        $select->join(['vlp' => 'sistema.vistorias_laudos_preliminares'], 'vlp.id_laudo_preliminar = lp.id', 'id_vistoria');
        $select->where("vlp.id_vistoria = {$idVistoria}");

        return $this->_db->fetchRow($select);
    }

    public function alterarStatusLaudo(int $idLaudoPreliminar, int $idStatus) : void
    {
        $row = $this->getRow($idLaudoPreliminar);
        $row->id_status = $idStatus;
        $row->save();
    }
}
