<?php

class Sinistro2_Model_ProcessosArquivosPendencias extends Agro_Db_Table_Abstract {
	protected $_schema = 'sinistro';
	protected $_name = 'processos_arquivos_pendencias';
	protected $_primary = 'id';

    const FILE_PATH = APPLICATION_PATH . '/upload_files/processos_arquivos_pendencias';
    const TIPO_DECLARAÇÃO_PRELIMINAR = 1;
    const TIPO_DECLARAÇÃO_FINAL = 2;
    const TIPO_AUTORIZAÇÃO_FINAL = 3;
    const TIPO_AUTORIZAÇÃO_PRELIMINAR = 4;
    const TIPO_LAUDO_PARCIAL_FINAL = 5;
    const TIPO_LAUDO_FINAL = 6;
    const TIPO_LAUDO_PRELIMINAR = 7;

    /**
     * Insere o edita um registro
     * 
     * @param array $dados
     * @return int
     */
    public function save(array $dados): int {  
        $row = $this->getRow($dados['id']);
        $row->id_processo = $dados['id_processo'];
        $row->id_status = $dados['id_status'];
        $row->id_empresa = $dados['id_empresa'];
        $row->ds_nome_arquivo = !empty($dados['ds_nome_arquivo']) ? $dados['ds_nome_arquivo'] : $row->ds_nome_arquivo;
        $row->nr_tipo = $dados['nr_tipo'];
        $row->nr_item_segurado = $dados['nr_item_segurado'];

        $id = $row->save();
        
        if (empty($id)) {
            throw new Exception("Erro salvar o arquivo.");
        }

        return $id; 
    }

    /**
     * Atualiza o status de um arquivo
     * 
     * @param int $id
     * @param int $idStatus
     * @return int
     */
    public function atualizarStatus(int $id, int $idStatus): int
    {
        $modelStatus = new Sistema_Model_Status();
        $idStatusAnaliseConcluida = $modelStatus->getIdStatus('ANALISE_CONCLUIDA', 'ARQUIVOS_PENDENTES_REGULACAO_LAUDOS');
        $row = $this->getRow($id);

        if (empty($row['id'])) {
            throw new Exception("Arquivo não encontrado para o id informado.");
        }
        
        //Se estou alterando o status para análise concluída movo o arquivo  da pasta do upload_filespara a pasta dos laudos
        if ($idStatus == $idStatusAnaliseConcluida) {

            if (!rename(self::FILE_PATH ."/". $row['ds_nome_arquivo'], PATH_LAUDOS . "/" . $row['ds_nome_arquivo'])) {
                throw new Exception("Erro ao mover arquivo.");
            }
        }

        //Se o status anterior era análise concluída, movo o arquivo da pasta dos laudos para a pasta no uploads_file
        if ($row->id_status == $idStatusAnaliseConcluida) {

            if (!rename(PATH_LAUDOS . "/" . $row['ds_nome_arquivo'], self::FILE_PATH ."/". $row['ds_nome_arquivo'])) {
                throw new Exception("Erro ao mover arquivo.");
            }
        }

        $row->id_status = $idStatus;
        $id = $row->save();

        if (empty($id)) {
            throw new Exception("Erro ao alterar o status.");
        }

        return $id; 
    }

    /**
     * Exclui logicamente o arquivo
     * 
     * @param int $id
     * @return int
     */
    public function excluirLogicamente(int $id): int
    {
        $row = $this->getRow($id);

        if (empty($row['id'])) {
            throw new Exception("Arquivo não encontrado para o id informado.");
        }

        $row->fl_del = 't';
        $id = $row->save();

        if (empty($id)) {
            throw new Exception("Erro ao excluir o arquivo.");
        }

        return $id; 
    }

    /**
     * Exclui permanentemente o arquivo
     * 
     * @param int $id
     */
    public function excluirPermanentemente($id): void
    {
        $row = $this->getRow($id);

        if (empty($row['id'])) {
            throw new Exception("Arquivo não encontrado para o id informado.");
        }

        $file = realpath(self::getDiretorioByStatus($row['id_status']) . "/" . $row['ds_nome_arquivo']);

        if (!file_exists($file)) {
            throw new Exception("Arquivo não encontrado.");
        }

        if (!unlink($file)) {
            throw new Exception("Não foi possível excluir o arquivo.");
        }

        $this->delete($id);
    }

    /**
     * Retornas os arquivos pendentes do processo
     * 
     * @param int $idProcesso
     * @return array
     */
    public function getByProcesso(int $idProcesso): array {
        $select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pap'=>'sinistro.processos_arquivos_pendencias'), '*');
        $select->join(array('s' => 'sistema.status'), 's.id = pap.id_status', 'ds_status');
        $select->join(array('e' => 'sistema.empresas'), 'e.id = pap.id_empresa', 'ds_nome_fantasia');
        $select->join(array('u' => 'sistema.usuarios'), 'u.id = pap.id_usuario_criacao', 'ds_nome_usuario as usuario_inclusao');
        $select->join(array('f' => 'sistema.funcionarios'), 'f.id_usuario = u.id', 'id_empresa as id_empresa_usuario_inclusao');
        $select->joinLeft(array('ualt' => 'sistema.usuarios'), 'ualt.id = pap.id_usuario_alteracao', 'ds_nome_usuario as usuario_alteracao');
        $select->joinLeft(array('falt' => 'sistema.funcionarios'), 'falt.id_usuario = ualt.id', 'id_empresa as id_empresa_usuario_alteracao');
        $select->where('pap.id_processo = ?', $idProcesso);
        $select->where('pap.fl_del = ?', 'f');

        if (!Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) {
            $User = Zend_Auth::getInstance()->getIdentity();
            $select->where("pap.id_empresa = {$User->id_empresa}");
        }

        $select->order(array('pap.id desc'));

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

    /**
     * Retornas os arquivos pendentes do processo da proposta informada
     * 
     * @param int $idProposta
     * @param string|null $chaveStatus
     * @return array
     */
    public function getByProposta(int $idProposta, ?string $chaveStatus = ''): array {
        $select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pap'=>'sinistro.processos_arquivos_pendencias'), '*');
        $select->join(array('p' => 'sinistro.processos'), 'p.id = pap.id_processo', null);
        $select->join(array('s' => 'sistema.status'), 's.id = pap.id_status', 'ds_status');
        $select->where('p.id_proposta = ?', $idProposta);
        $select->where('pap.fl_del = ?', 'f');

        if ($chaveStatus) {
            $select->where('s.ds_chave = ?', $chaveStatus);
        }

        $select->order(array('pap.id desc'));

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

    /**
     * Retorna o diretorio de acordo com o status.
     * Caso seja análise concluída, busca da pasta dos agronet/laudos, se não pega da upload_files/processos_arquivos_pendencias
     * 
     * @param int $idStatus
     * @return string
     */
    public static function getDiretorioByStatus(int $idStatus): string
    {
        $modelStatus = new Sistema_Model_Status();
        $diretorio = Sinistro2_Model_ProcessosArquivosPendencias::FILE_PATH;
        if ($idStatus == $modelStatus->getIdStatus('ANALISE_CONCLUIDA', 'ARQUIVOS_PENDENTES_REGULACAO_LAUDOS')) {
            $diretorio = PATH_LAUDOS;
        }

        return $diretorio;
    }

    /**
     * Retorna a descrição do tipo informado no parâmetro
     * 
     * @param int $tipoDocumento
     * @return string
     */
    public static function getDescricaoByTipo(int $tipoDocumento): string
    {
        switch ($tipoDocumento) {
            case self::TIPO_DECLARAÇÃO_PRELIMINAR:
                $descricao = 'DECLARAÇÃO PRELIMINAR';
                break;
            case self::TIPO_DECLARAÇÃO_FINAL:
                $descricao = 'DECLARAÇÃO FINAL';
                break;
            case self::TIPO_AUTORIZAÇÃO_FINAL:
                $descricao = 'AUTORIZAÇÃO FINAL';
                break;
            case self::TIPO_AUTORIZAÇÃO_PRELIMINAR:
                $descricao = 'AUTORIZAÇÃO PRELIMINAR';
                break;
            case self::TIPO_LAUDO_PARCIAL_FINAL:
                $descricao = 'LAUDO PARCIAL FINAL';
                break;
            case self::TIPO_LAUDO_FINAL:
                $descricao = 'LAUDO FINAL';
                break;
            case self::TIPO_LAUDO_PRELIMINAR:
                $descricao = 'LAUDO PRELIMINAR';
                break;
            default:
                $descricao = "TIPO NÃO ENCONTRADO";
                break;
        }
    
        return $descricao;
    }

    /**
     * Retorna a sigla de acordo com o tipo de pendência informado
     * 
     * @param int $tipoDocumento
     * @return string
     */
    public static function getSiglaByTipo(int $tipoDocumento): string
    {
        switch ($tipoDocumento) {
            case self::TIPO_DECLARAÇÃO_FINAL:
            case self::TIPO_AUTORIZAÇÃO_FINAL:
            case self::TIPO_LAUDO_PARCIAL_FINAL:
            case self::TIPO_LAUDO_FINAL:
                $descricao = 'VF';
                break;
            case self::TIPO_DECLARAÇÃO_PRELIMINAR:
            case self::TIPO_AUTORIZAÇÃO_PRELIMINAR:
            case self::TIPO_LAUDO_PRELIMINAR:
                $descricao = 'VL';
                break;
            default:
                $descricao = "VF";
                break;
        }
    
        return $descricao;
    }
}
