<?php

class Seguro_Model_PropostasArquivos extends Agro_Db_Table_Abstract {
	protected $_log = true;
	protected $_schema = 'seguro';
	protected $_name = 'propostas_arquivos';
	protected $_primary = 'id';

	public function save($croqui, $proposta, bool $origemUpload = false) {
		$TipoArquivo = new Sistema_Model_TipoArquivo();
		$Row = $this->createRow();

		$Row->id_tipo_arquivo = $TipoArquivo->getIdArquivo('CROQUI_PROPOSTA');
		$Row->ds_nome_arquivo = $croqui;
		$Row->id_proposta = $proposta;
		$Row->fl_origem_upload = $origemUpload ? 't' : 'f';

		return $Row->save();
	}
    
    public function saveDigitalizados($dados) {
        
        try {
            $Row = $this->createRow();
            $Row->id_tipo_arquivo = $dados['id_tipo_arquivo'];
            $Row->ds_nome_arquivo = $dados['ds_nome_arquivo'];
            $Row->id_proposta     = $dados['id_proposta'];
            $Row->id_status       = $dados['id_status'];
            
            return $Row->save();
            
        } catch (Exception $e) {
            return false;
        }
    }

	/**
	 * Salva Croquis
	 *
	 * @param $croqui - Nome do croqui
	 * @param integer $proposta - Id da proposta para vinculação
	 * @param bool $ajax - Tipo da requisição, default FALSE
	 */
	public function saveCroquiList($croqui, int $proposta, $ajax = false)
    {
        $row = $this->createRow();
        $croqui = Agro_File::clearFileName($croqui);

        try {
            $nome = "CROQUI_" . $proposta . "_" . date('His') . '_' . (rand() % 100) . '_' . '.';
            $nome .= Agro_Util::getExtension($croqui);
            $newFileName = strtoupper($nome);

            $row->id_tipo_arquivo = (new Sistema_Model_TipoArquivo())->getIdArquivo('CROQUI_PROPOSTA');
            $row->ds_nome_arquivo = $newFileName;
            $row->id_proposta = $proposta;

            $tmpFile = realpath(APPLICATION_PATH . "/upload_files/temp/$croqui");
            $newFile = APPLICATION_PATH . "/upload_files/croqui/" . $newFileName;

            if (copy($tmpFile, $newFile)) {
                if ($row->save()) {
                    unlink($tmpFile);

                    if (!$ajax) {
                        $this->setMessage('Croqui salvo com sucesso.');
                    }

                    return true;
                } else {
                    if ($ajax) {
                        die('Não foi possível realizar a operação.');
                    } else {
                        $this->setMessage('Não foi possível realizar a operação.');
                        return false;
                    }
                }
            } else {
                if ($ajax) {
                    die('Não foi possível realizar a operação.');
                } else {
                    $this->setMessage('Não foi possível realizar a operação.');
                    return false;
                }
            }
        } catch (Exception $e) {
            if ($ajax) {
                die('Não foi possível realizar a operação. \n' . $e);
            } else {
                $this->setMessage('Não foi possível realizar a operação. \n' . $e);
                return false;
            }
        }
    }

	/**
	 * Deleta croqui
	 *
	 * @param integer $id_croqui - Id do croqui
	 * @param bool $ajax - Tipo da requisição, default FALSE
	 */
	public function deleteCroquiList($id_croqui, $ajax=false)
    {
        try {
            $row = $this->getRow($id_croqui);

            if ($row) {
                $this->delete($row->id);

                $file = realpath(PATH_CROQUI . "/" . $row->ds_nome_arquivo);

                if (is_file($file)) {
                    unlink($file);
                }
            } else {
                if ($ajax) {
                    die("Croqui não encontrado");

                } else {
                    $this->setMessage("Croqui não encontrado");
                    return false;
                }
            }
        } catch (Exception $e) {
            if ($ajax) {
                die("Não  foi possível realizar a operação. \n $e");
            } else {
                $this->setMessage('Não foi possível realizar a operação. \n' . $e);
                return false;
            }
        }
    }

	public function saveCroquiSimples($dados) {
		$TipoArquivo = new Sistema_Model_TipoArquivo();
		$Row = $this->createRow();

		$Row->id_proposta = $dados['id_proposta'];
		$Row->id_tipo_arquivo = $TipoArquivo->getIdArquivo('CROQUI_PROPOSTA');
		$Row->ds_nome_arquivo = $dados['ds_nome_arquivo'];

		return $Row->save();
	}

	public function getPropostasArquivos($idProposta) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pa'=>'seguro.propostas_arquivos'),'*');
		$select->join(array('ta'=>'sistema.tipo_arquivo'),'pa.id_tipo_arquivo = ta.id','ds_tipo_arquivo');

		$select->where('pa.fl_ativo = true and ' .
			$this->getAdapter()->quoteInto('pa.id_proposta = ?',$idProposta)
		);

		return $this->fetchAll($select)->toArray();
	}

	public function getPropostaCroquis($idProposta){
		$TipoArquivo = new Sistema_Model_TipoArquivo();

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from('seguro.propostas_arquivos');

		$select->where('fl_ativo = true and ' . $this->getAdapter()->quoteInto('id_proposta = ?',$idProposta));

		$select->where(" id_tipo_arquivo = ".$TipoArquivo->getIdArquivo('CROQUI_PROPOSTA'));

		$select->where(" ds_nome_arquivo <> 'croqui_georref_renovacao'");

		return $this->fetchAll($select)->toArray();

	}

	public function nextSequenceId() {
		$value = $this->_db->fetchOne("SELECT NEXTVAL('seguro.propostas_arquivos_id_seq')");
		return $value;
    }

    public function deleteCroquis($proposta) {
    	$TipoArquivo = new Sistema_Model_TipoArquivo();
		$idTipoArquivo = $TipoArquivo->getIdArquivo('CROQUI_PROPOSTA');

		if ($proposta) {
			$this->_db->query("delete from seguro.propostas_arquivos where id_proposta = $proposta and id_tipo_arquivo = $idTipoArquivo");
		}
    }

    public function getCroquis($proposta) {
    	$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pa'=>'seguro.propostas_arquivos'),'*');
		$select->join(array('ta'=>'sistema.tipo_arquivo'),'pa.id_tipo_arquivo = ta.id', false);
		$select->where('ta.ds_nome_arquivo = ?', "croqui_proposta");
		$select->where('id_proposta = ?', $proposta);
		return $this->fetchAll($select);
    }

    public function contaCroqui($id_proposta) {
    	$sql = "select count(id_proposta) from seguro.propostas_arquivos where id_proposta = $id_proposta";
    	$qtd = $this->_db->fetchOne($sql);
    	return $qtd;
    }

	public function deleteCroquisName($name, $id_proposta) {
		$deleted = array('status' => false);

		if ($name) {

			$Row = $this->fetchRow("ds_nome_arquivo = '$name' and id_proposta = $id_proposta");

			try {

				if ($Row) {
					$deleted['id_proposta'] = $Row->id_proposta;
					if ($this->getAdapter()->query("delete from seguro.propostas_arquivos where id_proposta = {$id_proposta} and upper(ds_nome_arquivo) = upper('$name')")) {
						$deleted['status'] = true;
					}
				}
			} catch (Exception $e) {
				$deleted['status'] = false;
			}
		}

		return $deleted;
    }
    
    //Retorna o status do arquivo ativo para o tipo de arquivo/proposta
    public function getStatusArquivo($idProposta, $idTipoArquivo) {
		$select = $this->select()->setIntegrityCheck(false);
		
		$select->from(array('pa'=>'seguro.propostas_arquivos'),null);
		$select->join(array('ta'=>'sistema.tipo_arquivo'),'pa.id_tipo_arquivo = ta.id',null);
        $select->join(array('st'=>'sistema.status'),'st.id = pa.id_status','ds_status');
        $select->where('pa.id_proposta = ?', $idProposta);
        $select->where('ta.id = ?', $idTipoArquivo);
        $select->where('pa.fl_ativo = true');
        
        return $this->getAdapter()->fetchOne($select);
       
    }
    
    //Retorna o nome do arquivo ativo para o tipo de arquivo/proposta
    public function getLastArquivoByProposta($idProposta, $idTipoArquivo) {
        $select = $this->select()->setIntegrityCheck(false);
        
		$select->from(array('pa'=>'seguro.propostas_arquivos'), 'pa.ds_nome_arquivo');
		$select->join(array('ta'=>'sistema.tipo_arquivo'),'pa.id_tipo_arquivo = ta.id',null);
        $select->join(array('st'=>'sistema.status'),'st.id = pa.id_status',null);
        $select->where('pa.id_proposta = ?', $idProposta);
        $select->where('ta.id = ?', $idTipoArquivo);
        $select->where('pa.fl_ativo = true');
        
        return $this->getAdapter()->fetchOne($select);
    }
    
    //Retorna a chave de status do arquivo ativo para o tipo de arquivo/proposta
    public function getChaveStatusByPropostaTipo($idProposta,$idTipoArquivo) {
        $select = $this->select()->setIntegrityCheck(false);
        
		$select->from(array('pa'=>'seguro.propostas_arquivos'),null);
		$select->join(array('ta'=>'sistema.tipo_arquivo'),'pa.id_tipo_arquivo = ta.id',null);
        $select->join(array('st'=>'sistema.status'),'st.id = pa.id_status', 'st.ds_chave');
        $select->where('pa.id_proposta = ?', $idProposta);
        $select->where('ta.id = ?', $idTipoArquivo);
        $select->where('pa.fl_ativo = true');
        
        return $this->getAdapter()->fetchOne($select);
    }
    
    //Lista todos os arquivos já enviados de determinado tipo/proposta
    public function listArquivosDigitalizados($id_proposta, $id_tipo_arquivo) {
        
        //pega pendências e concatena entre vírgulas
        $pendencias = $this->select()
            ->setIntegrityCheck(false)
            ->from(array('ap' => 'atendimento.pendencias'), array('CAST(ap.ds_nome_pendencia AS varchar) as ds_nome_pendencia'))
            ->join(array('pap' => 'seguro.propostas_arquivos_pendencias'), 'ap.id = pap.id_pendencia', null)
            ->where('pap.id_proposta_arquivo = pa.id');
        
        $select = $this->select()->setIntegrityCheck(false);
        
        $select->from(array('pa'=>'seguro.propostas_arquivos'), 
            array('to_char(pa.dt_criacao, \'dd/mm/yyyy\') as dt_criacao', 'pa.ds_nome_arquivo', 'id', 'id_proposta', 'fl_ativo', 'id_status',
                "array_to_string(array($pendencias),', ') as pendencias"));
        $select->join(array('s'=>'sistema.status'), 'pa.id_status = s.id', array('s.ds_chave', 's.ds_status'));
        $select->join(array('ta'=>'sistema.tipo_arquivo'), 'pa.id_tipo_arquivo = ta.id', null);
        $select->join(array('u'=>'sistema.usuarios'), 'pa.id_usuario_criacao = u.id', 'u.ds_nome_usuario');
        $select->where('pa.id_proposta = ?', $id_proposta);
        $select->where('pa.id_tipo_arquivo = ?', $id_tipo_arquivo);
        $select->order('pa.dt_criacao DESC');
        
        return $this->getAdapter()->fetchAll($select);
    }
    
    //Marca o registro do arquivo como false pelo id do arquivo
    public function setArquivoFalse($idArquivo) {
       try {
           $Row = $this->getRow($idArquivo);
           $Row->fl_ativo = 'f';
           return $Row->save();
       } catch (Exception $e) {
           return false;
       } 
	}
}