<?php declare(strict_types=1);

class Sinistro2_Model_LiquidacaoPagamentoAdicional extends Agro_Db_Table_Abstract
{
    protected $_schema = 'sinistro';
	protected $_name = 'liquidacao_pagamento_adicional';
	protected $_primary = 'id';

    const USUARIOS_PERMISSAO_EDICAO_EXCLUSAO = ['tatiana.tondim', 'marcia.correa', 'tiago.zschornack'];

    public function salvar(array $dados): Zend_Db_Table_Row
    {
        $row = $this->createRow();

        $this->update(['fl_ativo' => 0], "id_liquidacao = {$dados['id_liquidacao']} AND fl_ativo IS TRUE");
        
        $row->id_liquidacao = $dados['id_liquidacao'];
        $row->vl_indenizacao_paga = $dados['vl_indenizacao_paga'];
        $row->vl_total_corrigido = $dados['vl_total_corrigido'];
        $row->ds_observacao = $dados['ds_observacao'] ?? null;
        $row->id_status = $dados['id_status'];
        $row->ds_nome_arquivo = $dados['ds_nome_arquivo'] ?? null;

        $row->save();
        
        return $row;
    }

    public function deletar(int $idLiquidacao)
    {
        $this->update(['fl_del' => 1, 'fl_ativo' => 0], "id_liquidacao = {$idLiquidacao} AND fl_ativo IS TRUE");
    }

    public function getHistorico(int $idLiquidacao): Zend_Db_Table_Rowset
    {
        return $this->fetchAll(
            $this->select()
                ->setIntegrityCheck(false)
                ->from(
                    ['slpa' => 'sinistro.liquidacao_pagamento_adicional'],
                    "TO_CHAR(slpa.dt_criacao, 'DD/MM/YYY : HH24:MI:SS') AS dt_criacao, CASE WHEN slpa.fl_del IS TRUE THEN 'Exclusão' ELSE 'Edição' END AS acao"
                )
                ->join(['sf' => 'sistema.funcionarios'], 'sf.id_usuario = slpa.id_usuario_criacao', 'ds_nome_funcionario')
                ->join(['su' => 'sistema.usuarios'], 'su.id = sf.id_usuario', 'ds_nome_usuario')
                ->where('slpa.id_liquidacao = ?', $idLiquidacao)
                ->where('slpa.fl_ativo IS FALSE')
                ->order('slpa.dt_criacao desc')
        );
    }

    public function getPagamentoAdicionalByNomeArquivo(string $nomeArquivo): ?Zend_Db_Table_Row
    {
        return $this->fetchRow(
            $this->select()
                ->where('ds_nome_arquivo = ?', $nomeArquivo)
                ->where('fl_ativo IS TRUE')
        );
    }

    public function getPagamentoAdicional(int $idLiquidacao): ?Zend_Db_Table_Row
    {
        return $this->fetchRow(
            $this->select()
                ->where('id_liquidacao = ?', $idLiquidacao)
                ->where('fl_ativo IS TRUE')
                ->order('id DESC')
        );
    }

    // Usuário responsável por lançar pagamento adicional
    public function getIdUsuarioResponsavelCriacao(int $idLiquidacao): int
    {
        $ultimaExclusao = $this->fetchRow(
            $this->select()
                ->where('id_liquidacao = ?', $idLiquidacao)
                ->where('fl_del IS TRUE')
                ->order('id DESC')
                ->limit(1)
        );
        
        $query = $this->select()
            ->where('id_liquidacao = ?', $idLiquidacao)
            ->order('id ASC')
            ->limit(1);

        if (!empty($ultimaExclusao)) {
            $query->where('id > ?', $ultimaExclusao->id);
        }
        
        $row = $this->fetchRow($query);

        return $row->id_usuario_criacao ?? 0;
    }

    public function existeArquivo(int $idLiquidacao, string $nomeArquivo): bool
    {
        $rs = $this->fetchRow(
            $this->select()
                ->where('id_liquidacao <> ?', $idLiquidacao)
                ->where('ds_nome_arquivo = ?', $nomeArquivo)
                ->where('fl_ativo IS TRUE')
        );

        return !empty($rs);
    }

    public function getMapIdsLiquidacoesPagamentoAdicional(array $idsLiquidacoes, int $idStatus = 0): array
    {
        $query = $this->select()
                ->where('id_liquidacao IN(?)', $idsLiquidacoes)
                ->where('fl_ativo IS TRUE');
        
        if ($idStatus != 0) {
            $query->where('id_status = ?', $idStatus);
        }

        $rs = $this->_db->fetchAll($query);

        $map = [];
        
        foreach ($rs as $row) {
            $map[$row['id_liquidacao']] = $row;
        }
        
        return $map;
    }

    public function getIdsPropostasPagamentoPendente(): array
    {
        $idStatus = (new Sistema_Model_Status())
			->getId('PENDENTE_PAGAMENTO', 'LIQUIDACAO_PAGAMENTO_ADICIONAL');

        return $this->_db->fetchAll(
            $this->select()
                ->setIntegrityCheck(false)
                ->from(['slpa' => 'sinistro.liquidacao_pagamento_adicional'])
                ->join(['sl' => 'sinistro.liquidacoes'], 'sl.id = slpa.id_liquidacao', false)
                ->join(['sp' => 'sinistro.processos'], 'sp.id = sl.id_processo', false)
                ->join(['spr' => 'seguro.propostas'], 'spr.id = sp.id_proposta', 'id_proposta_mae')
                ->where('sl.fl_ativo IS TRUE')
                ->where('slpa.fl_ativo IS TRUE')
                ->where("slpa.id_status = {$idStatus}")
        );
    }
}
