<?php declare(strict_types=1);

class Sinistro2_Service_SalvarArquivoProcesso
{
    public function executar(int $idProcesso, int $idTipoArquivo): string
    {
        // Obtém o arquivo do upload
		$adapter = new Zend_File_Transfer_Adapter_Http();
		$file = $adapter->getFileInfo();
        
        // Gera o nome do novo arquivo
        $tipoArquivoProcesso = new Sistema_Model_TipoArquivoProcesso();
        $tipoArquivo = $tipoArquivoProcesso->fetchRow(
            $tipoArquivoProcesso->getAdapter()->quoteInto('id = ?', $idTipoArquivo)
        )->toArray();

        $processoArquivo = new Sinistro2_Model_ProcessosArquivos();
        $id = $processoArquivo->nextSequenceId();

        $processo = new Sinistro2_Model_Processos();
        $proponente = $processo->getProponenteProcesso($idProcesso);

        $countArquivos = $processoArquivo->getCountTipoArquivo($proponente['cpf_cnpj'], $idTipoArquivo);
        if ($countArquivos < 1) {
            $countArquivos = 1;
        } else {
            $countArquivos += 1;
        }

        $extensao = strtolower(end(explode('.', $file['arquivo']['name'])));

        $cpf_cnpj = str_replace(".", "", $proponente['cpf_cnpj']);
        $cpf_cnpj = str_replace("-", "", $cpf_cnpj);
        $cpf_cnpj = str_replace("/", "", $cpf_cnpj);

        if(
            $tipoArquivo['ds_chave_tipo_arquivo'] == 'LIQUIDACAO'
            || $tipoArquivo['ds_chave_tipo_arquivo'] == 'DIFERENCA_INDENIZACAO'
        ) {
            $propostaMae = $processo->getPropostaMaeByProcesso($idProcesso);
            $nomeArquivo = $propostaMae."_".$tipoArquivo['ds_chave_tipo_arquivo']."_".$countArquivos.".".$extensao;
        } else {
            $nomeArquivo = $cpf_cnpj."_".$tipoArquivo['ds_chave_tipo_arquivo']."_".$countArquivos.".".$extensao;
        }

        $target = APPLICATION_PATH.'/upload_files/sinistro_processo/'.$nomeArquivo;

        // Faz o upload do arquivo
        $adapter->addFilter('Rename', array(
            'source' => $file['arquivo']['tmp_name'],
            'target' => $target,
            'overwrite' => true)
        );

        $adapter->addValidator('Size', false, 14680064)
            ->addValidator('Extension', false, ['pdf', 'PDF', 'jpg', 'JPG', 'jpeg', 'JPEG', 'png', 'PNG', 'jfif', 'JFIF']);
        
        if (!$adapter->isValid()) {
            throw new Exception('Por favor, verifique o tamanho do arquivo (máximo permitido 14Mb) e/ou a sua extensão (permitidas pdf,jpg,jpeg,png ou jfif)');
        } else if ($adapter->receive()) {

            // Salva registro na tabela processos_arquivos
            $data = array();
            $data['id'] = $id;
            $data['id_processo'] = $idProcesso;
            $data['id_tipo_arquivo'] = $idTipoArquivo;
            $data['ds_nome_arquivo'] = $nomeArquivo;

            $processoArquivo->insert($data);

            // Se o status dos arquivos do processo for 'não enviado', altera para 'pendente'
            $idStatus = $processo->getIdStatus('NAO_ENVIADO', 'ARQUIVOS_PROCESSO_SINISTRO');
            if($idStatus == $processo->id_status_arquivos) {
                $processo->id_status_arquivos = $processo->getIdStatus('NAO_ANALISADO', 'ARQUIVOS_PROCESSO_SINISTRO');
                $processo->save();
            }

            if(
                $tipoArquivo['ds_chave_tipo_arquivo'] != 'LIQUIDACAO'
                && $tipoArquivo['ds_chave_tipo_arquivo'] != 'DIFERENCA_INDENIZACAO'
            ) {
                $rowProcesso = $processo->getRow($idProcesso);
                $rowProcesso->id_status_arquivos = $processo->getIdStatus('NAO_ANALISADO', 'ARQUIVOS_PROCESSO_SINISTRO');
                $rowProcesso->save();
            }

            $trans = (new Sinistro2_Service_TransmitirArquivoEssor())->executar($idProcesso, $id, $idTipoArquivo, $nomeArquivo, $target);
            if (!$trans['status']) {
                throw new Exception('Erro ao enviar arquivo para seguradora. Arquivo não cadastrado.');
            }

            $processoArquivo->update(array('fl_transmitido_seguradora' => 'true'), 'id = ' . $id);
        }

        return $nomeArquivo;
    }
}