<?php

class Seguro_Model_PropostasDevolucoesStatus extends Agro_Db_Table_Abstract {
	protected $_schema = 'seguro';
	protected $_name = 'propostas_devolucoes_status';
	protected $_primary = 'id';
	public $_order = 'id';

    const ID_STATUS_EM_FILA_AGENDAMENTO = 284;
    const ID_STATUS_EM_PROCESSAMENTO = 285;
    const ID_STATUS_AGENDADA = 286;
    const ID_STATUS_DEVOLUCAO_EFETUADA = 287;
    const ID_STATUS_PENDENCIA_CORRETOR = 288;
    const ID_STATUS_EM_ANALISE = 289;
    const ID_STATUS_EM_ANALISE_COM_TERMO = 290;
    const ID_STATUS_EM_FILA_AGENDAMENTO_COM_TERMO = 291;
    const ID_STATUS_AGENDADA_COM_TERMO = 292;
    const ID_STATUS_DEVOLUCAO_EFETUADAO_COM_TERMO = 293;
    const ID_STATUS_FINALIZADO_CREDITO_REAPROVEITADO = 294;

    public function save(array $dados) :? int
    {
        if (empty($dados['id_proposta_devolucao'])) {
            return null;
        }

        if (empty($dados['id'])) {
            $this->update(array('fl_ativo' => 0), "fl_ativo is true AND id_proposta_devolucao = " . $dados['id_proposta_devolucao']);
        }

        $Row = $this->getRow($dados['id']);
        $Row->id_proposta_devolucao = $dados['id_proposta_devolucao'];
        $Row->id_status = $dados['id_status'];
        $Row->ds_observacao = $dados['ds_observacao'];
        $Row->fl_observacao_automatica = empty($dados['fl_observacao_automatica']) ? 0 : 1;
        $Row->fl_devolvido_financeiro_banco =
            ($dados['fl_devolvido_financeiro_banco'] == '0' || !array_key_exists('fl_devolvido_financeiro_banco', $dados))
                ? 0
                : 1;
        
        return $Row->save();
    }

    /**
     * Retorna o(s) status de uma devolução
     *
     * @param int $idPropostaDevolucao
     * @param bool $somenteAtivo
     * @return array
     */
    public function getByIdPropostaDevolucao(int $idPropostaDevolucao, bool $somenteAtivo = true) : array
    {
        $select = $this->select()->setIntegrityCheck(false)
            ->from(array('pds' => 'seguro.propostas_devolucoes_status'), '*')
            ->join(array('s' => 'sistema.status'), 's.id = pds.id_status', 'ds_status')
            ->join(array('u' => 'sistema.usuarios'), 'u.id = pds.id_usuario_criacao', 'ds_nome_usuario')
            ->where('id_proposta_devolucao = ?', $idPropostaDevolucao);
        
        if ($somenteAtivo) {
            $select->where('pds.fl_ativo is true');
        }

        $select->order('id DESC');
        
        return $this->fetchAll($select)->toArray();
    }

    /**
     * Retorna o combo dos status do tipo DEVOLUCAO_PREMIO ativos.
     *
     * @return array
     */
    public function getComboStatusDevolucoes(): array
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct();
		$select->from(array('s' => 'sistema.status'), array('id', 'cd_status', 'ds_status', 'ds_chave'));
		$select->join(array('t' => 'sistema.tipo_status'), 's.id_tipo_status = t.id', false);
		$select->where("t.ds_chave = 'DEVOLUCAO_PREMIO'");
		$select->where('s.fl_ativo = true');
		$select->where('t.fl_ativo = true');
		$select->order('cd_status');

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

    /**
     * Delete o registro pelo ID informado.
     * Valida se esse registro é o ativo, caso seja, busca o último registro inativo e o altera para ser o novo ativo.
     *
     * @param int $id
     */
    public function deleteById(int $id)
    {
        $row = $this->find(trim($id))->current();

        if (empty($row)) {
            throw new Exception("Nenhum registro de histórico encontrado para o ID informado.");
        }

        if ($row['fl_ativo']) {
            $this->ativarRegistroAnterior($row['id_proposta_devolucao']);
        }

        return $this->delete($id);
    }

    /**
     * Ativa o último registro inativo pelo id da devolução da proposta.
     *
     * @param int $idPropostaDevolucao
     * @return void
     */
    private function ativarRegistroAnterior(int $idPropostaDevolucao): void
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pds' => 'seguro.propostas_devolucoes_status'), 'id');
        $select->where('id_proposta_devolucao = ?', $idPropostaDevolucao);
        $select->where('fl_ativo is false');
        $select->order('id desc');
        $select->limit(1);

        $idRegistroAnterior = $this->_db->fetchOne($select);
        
        if (empty($idRegistroAnterior)) {
            throw new Exception("Não é possível excluir o histórico pois a proposta ficará sem nenhum registro de devolução ativo.");
        }

        if (empty($dados['id'])) {
            $this->update(array('fl_ativo' => 1), "id = " . $idRegistroAnterior);
        }
    }

    /**
     * Valida se pode ser editados os dados bancários da devolução de acordo com o usuário e o status da devoluação
     *
     * @param int $idPropostaDevolucao
     * @return bool
     */
    public function permiteEditarDadosBancarios(int $idPropostaDevolucao): bool
    {
        if (Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) {
            return true;
        }
        
        $statusDevolucao = $this->getByIdPropostaDevolucao($idPropostaDevolucao);
        $statusValidos = [
            self::ID_STATUS_EM_ANALISE_COM_TERMO,
            self::ID_STATUS_EM_PROCESSAMENTO,
            self::ID_STATUS_PENDENCIA_CORRETOR
        ];
        return in_array($statusDevolucao[0]['id_status'], $statusValidos);
    }

    public static function statusNaoLimpamDataProgramada() : array
    {
        return [
            self::ID_STATUS_AGENDADA,
            self::ID_STATUS_DEVOLUCAO_EFETUADA,
            self::ID_STATUS_AGENDADA_COM_TERMO,
            self::ID_STATUS_DEVOLUCAO_EFETUADAO_COM_TERMO,
        ];
    }
}
