<?php

class Sistema_Model_Prepostos extends Agro_Db_Table_Abstract {
	public $_order = 'ds_nome_fantasia';
	protected $_schema = 'sistema';
	protected $_name = 'prepostos';
	protected $_primary = 'id';
	protected $_rowClass = 'Sistema_Model_Row_Preposto';

	public $_columnExcel = array(
		'id' => 'Cod.',
	    'ds_nome_preposto' => 'Preposto',
		'ds_nome_fantasia' => 'Corretor',
	    'id_usuario' => 'Id. Usuario',
		'ds_nome_usuario' => 'Usuario',
	    'telefones_lista' => 'Telefones',
	    'ativo' => 'Ativo'
	   	);

	protected $_referenceMap    = array (
		'Sistema_Model_Corretores' => array(
			'columns'           => array('id_corretor'),
			'refTableClass'     => 'Sistema_Model_Corretores',
			'refColumns'        => array('id'),
		)
    );

	/**
	 * Salva um preposto no banco
	 *
	 * @param array $data
	 * @return boolean
	 */
	public function save(array $data) {
		$ExcecaoUsuario = new Sistema_Model_ExcecaoUsuario();
		$Usuarios = new Sistema_Model_Usuarios();

		$this->getDefaultAdapter()->beginTransaction();

		$idUser = $Usuarios->save($data);

		try {
			if ($idUser) {
				$Row = $this->getRow($data['id']);
				$Row->id_corretor = $data['id_corretor'];
				$Row->id_usuario = $idUser;
				$Row->ds_nome_preposto = $data['ds_nome_preposto'];
				$Row->ds_nome_responsavel = $data['ds_nome_responsavel'];
				$Row->ds_email = $data['ds_email'];
				$Row->ds_observacao = $data['ds_observacao'];
				$Row->id_prepostos_frase_declaracao = $data['id_prepostos_frase_declaracao'] ? $data['id_prepostos_frase_declaracao'] : null;
				$Row->ds_vinculo_declaraco = $data['ds_vinculo_declaraco'];
				$Row->ds_nome_contato = $data['ds_nome_contato'];
				$Row->fl_autorizacao_cancelamento = (in_array(2, $data['ds_excecoes']) ? 0 : 1);
				$Row->id_comercial = $data['id_comercial'];
				$Row->ds_excecoes = (string) implode(',', $data['ds_excecoes']);
				$Row->fl_permite_alterar_comissao = $data['fl_permite_alterar_comissao'] ?? $Row->fl_permite_alterar_comissao;
				$Row->save();


				//Só entrará aqui se a aba "permissões" estiver visível
				if (is_array($data['permissoes']) && $data['id']) {
					if (!$ExcecaoUsuario->save($data['permissoes'], $data['id_usuario'])) {
						return false;
					}
				}

				$data['id'] = ($data['id'] == null ? $Row->id : $data['id']);
				$data['id_usuario'] = ($data['id_usuario'] == null ? $Row->id_usuario : $data['id_usuario']);

				//Cadastro de exceções
				$acoes['nao_permitido'] = [];
				$acoes['permitido'] = [];
                $restricoes = $ExcecaoUsuario::$_RESTRICOES_PREPOSTO;
                $acoesRestricoes = [];
                $acoesRestricoes = array_merge($acoesRestricoes, $restricoes[1]);
                $acoesRestricoes = array_merge($acoesRestricoes, $restricoes[3]);
                $acoesRestricoes = array_merge($acoesRestricoes, $restricoes[4]);

                $modelUsuarioAcao = new Sistema_Model_UsuarioAcao();
                $acoesUsuario = $modelUsuarioAcao->getPrivileges($data['id_usuario'], $acoesRestricoes)->toArray();

                foreach ($acoesUsuario as $acaoUsuario) {
                    if ($acaoUsuario['fl_permitido'] === true) {
                        $acoes['permitido'][] = $acaoUsuario['id_acao'];
                    } else {
                        $acoes['nao_permitido'][] = $acaoUsuario['id_acao'];
                    }
                }

				if (is_array($data['ds_excecoes']) && ($data['id'])) {
					foreach ( $data['ds_excecoes'] as $excecao ) {
						switch ($excecao) {
							case 1:
							case 3:
							case 4:
								$acoes['nao_permitido'] = array_merge($acoes['nao_permitido'], $restricoes[$excecao]);
								break;
						}
					}
				}

                $data['id_acao'] = $acoes;
                if (!$ExcecaoUsuario->setBloqueioAcao($data)) {
                    return false;
                }

				/* Foi comentado para que o preposto não receba as configurações do corretor visto que,
				muitas vezes, o preposto em questão não deve realmente ter as mesmas configurações de
				capacidade que o corretor possui
				Na tarefa #2288 foi pedido pra descomentar */
				$CapacidadeUsuario = new Produto_Model_ValidacoesCapacidadeUsuarios();
				$CapacidadeUsuario->addCorretorPreposto($idUser, $this->getValidacoesCapacidadesUsuarioCorretor($Row->id_corretor));

				$this->getDefaultAdapter()->commit();
				return $Row;
			} else {
				$this->setMessage($Usuarios->getMessages());
				return false;
			}

			$this->getDefaultAdapter()->rollBack();
			return false;
		} catch (Exception $e) {
			$this->getDefaultAdapter()->rollBack();
			return false;
		}
	}

	public function getValidacoesCapacidadesUsuarioCorretor($idCorretor) {
		$Corretor = new Sistema_Model_Corretores();
		$corretores = $Corretor->fetchRow("id = ". $idCorretor);
		$CapacidadeUsuario = new Produto_Model_ValidacoesCapacidadeUsuarios();
		$validacoes = $CapacidadeUsuario->getValidacoesByUsuario($corretores->id_usuario);
		return $validacoes;
	}

	public function getData($where=false) {
		$select = $this->select()->distinct(true)->setIntegrityCheck(false);
		$select->from(array('p' => 'sistema.v_prepostos'), array('p.cpf_cnpj', 'p.id_usuario','p.id_corretor','p.fl_ativo', 'p.id', 'p.ds_nome_preposto', 'p.ds_email', 'p.ds_nome_contato', 'p.fl_autorizacao_cancelamento', 'p.fl_autorizacao_endosso', 'p.telefones', 'p.telefones_lista', 'ativo', 'ds_excecoes'));
		$select->join(array('c' => 'sistema.corretores'), 'p.id_corretor = c.id', array('ds_nome_fantasia'));
		$select->joinLeft(array('u' => 'sistema.usuarios'), 'p.id_usuario = u.id', array('ds_nome_usuario'));
		$select->joinLeft(array('u2' => 'sistema.usuarios'), 'p.id_comercial = u2.id', array('ds_nome_usuario as comercial'));
		$select->joinLeft(array('f'=>'sistema.funcionarios'), 'p.id_comercial = f.id_usuario', array('ds_nome_funcionario'));
		$select->joinLeft(array('ppca'=>'sistema.prepostos_periodo_cadastro_anual'), 'ppca.id_preposto = p.id and ppca.fl_cadastro_validado is false', array('dt_inicio', 'dt_fim'));
		$select->order($this->_order);

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];

					$select->where("$field $operator ?", $value);
				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		return $select;
	}

	public function getCombo($idCorretor) {
		//echo $idCorretor; die;
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'sistema.prepostos'), 'id_usuario, ds_nome_preposto');
		$select->where("id_corretor = $idCorretor");
		$Rs = $this->fetchAll($select);
		//die($select);
		if ($Rs->count()) {
			$options[] = '';
			foreach ($Rs as $row) {
				$options[$row['id_usuario']] = $row['ds_nome_preposto'];
			}

			return $options;
		} else {
			return array();
		}
	}

	public function getComboUsuario($idUserCorretor, bool $primeiraOpcaoEmBranco = true) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('p' => 'sistema.prepostos'), array('id_usuario','ds_nome_preposto'));
		$select->join(array('c' => 'sistema.corretores'),'p.id_corretor = c.id', false);
		$select->join(array('u' => 'sistema.usuarios'),'u.id = p.id_usuario', array('ds_nome_usuario'));
		$select->where('c.id_usuario = ?', $idUserCorretor);
		$select->where('p.fl_ativo = true');
		$select->order('ds_nome_usuario');
		$Rs = $this->fetchAll($select);

		$options = $primeiraOpcaoEmBranco ? array('' => '') : [];
		if ($Rs->count()) {
			foreach ($Rs as $Row) {
				$options[$Row->id_usuario] = $Row->ds_nome_usuario;
			}

			return $options;
		} else {
			return array();
		}
	}

	public function getTelefones($id) {
		$Row = $this->find($id)->current();

		$select = $this->select()->distinct(true);
		$select->setIntegrityCheck(false);
		$select->from(array('t' => 'sistema.telefone'));
		//$select->join(array('tt' => 'sistema.tipo_telefone'),'t.id_tipo_telefone = tt.id', 'tp_telefone');
		$select->where("t.id_usuario=?", $Row->id_usuario);
		return $this->fetchAll($select);
	}

	public function getEndereco(int $id)
    {
        $select = $this->select()->distinct(true);
        $select->setIntegrityCheck(false);
        $select->from(array('p' => 'sistema.prepostos'));
        $select->join(array('m' => 'sistema.municipios'), 'p.id_municipio = m.id');
        $select->join(array('e' => 'sistema.estados'), 'm.id_estado = e.id');
        $select->where("p.id = ?", $id);

        //return $this->fetchRow($select);
        return null;
    }

	public function getCorretor($id) {
		$Row = $this->find($id)->current();

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('c' => 'sistema.corretores'));
		$select->join(array('p' => 'sistema.prepostos'), 'p.id_corretor = c.id', false);
		$select->where("p.id_usuario=?", $Row->id_usuario);

		$Row = $this->fetchRow($select);

		return $Row;
	}

	public function getPairsFraseDeclaracao() {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('f' => 'sistema.prepostos_frase_declaracao'), '*');

		$rows = $this->fetchAll($select)->toArray();

		$return = array(0 => 'Selecione');
		foreach ($rows as $key => $value) {
			$return[$value['id']] = $value['ds_frase'];
		}

		return $return;
	}

	public function getCorretorByUsuario($id) {

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('c' => 'sistema.corretores'));
		$select->join(array('p' => 'sistema.prepostos'), 'p.id_corretor = c.id', false);
		$select->where("p.id_usuario=?", $id);

		$Row = $this->fetchRow($select);

		return $Row;
	}

	public function findByUser($id) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p' => 'sistema.prepostos'));
		$select->join(array('u' => 'sistema.usuarios'),'p.id_usuario = u.id', ['ds_nome_usuario']);
		$select->where("p.id_usuario=$id");
		$row = $this->fetchRow($select);

		return $row;
	}

	public function desativaPrepostos($idCorretor) {
	    $User = Zend_Auth::getInstance()->getIdentity();
	    $this->_db->query("UPDATE sistema.prepostos SET fl_ativo=false, dt_alteracao=now(), id_usuario_alteracao=".$User->id." WHERE id_corretor = $idCorretor");
	}

	public function atualizarIdComercialCorretor(int $idCorretor, int $idComercial)
    {
        $this->_db->update(
          "{$this->_schema}.{$this->_name}",
          ['id_comercial' => $idComercial],
          "id_corretor = {$idCorretor}"
        );
    }

    public function getComboUsuarioByCorretores(array $corretores)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'sistema.prepostos'), array('id_usuario', 'ds_nome_preposto', 'id_corretor'));
        $select->join(array('c' => 'sistema.corretores'), 'p.id_corretor = c.id', false);
        $select->join(array('u' => 'sistema.usuarios'), 'u.id = p.id_usuario', array('ds_nome_usuario'));
        $select->where('c.id_usuario in (' . implode(', ', $corretores) . ')');
        $select->where('p.fl_ativo = true');
        $select->order('ds_nome_usuario');

        $Rs = $this->fetchAll($select);
        $options = [];

        if ($Rs->count()) {
            foreach ($Rs as $Row) {
                $options[$Row->id_usuario] = ['nome' => $Row->ds_nome_preposto, 'id_corretor' => $Row->id_corretor];
            }
        }

        return $options;
    }
	
}
