<?php

class Sistema_Model_ExcecaoUsuario extends Agro_Db_Table_Abstract {
	protected $_schema = 'sistema';
	protected $_name = 'usuarios_acao';
	protected $_primary = array('id_usuario', 'id_acao');
	protected $_sequence = false;

	static $_RESTRICOES_PREPOSTO = array(
		1 =>  array(62, 435, 436, 437, 732),
		3 => array(1300, 1306, 1307, 1308, 1309, 1299, 1302, 1301),
		4 => array(1575, 1616, 1617, 1621, 1623, 1630, 1624, 1622, 1618, 1635, 1625, 1626, 1631, 1633, 1636, 1637)
	);

	public function save(array $params) {
		$acoes = implode(',', $params['id_acao']);

		try {
			$Rs = $this->getDefaultAdapter()->fetchAll("select id from sistema.acao where id not in ($acoes)");
			foreach ($Rs as $Acao) {
				$this->insert(array(
					'fl_permitido' => 0,
					'id_usuario' => $params['id_usuario'],
					'id_acao' => $Acao['id']
				));
			}

			$Rs = $this->getDefaultAdapter()->fetchAll("select id from sistema.acao where id in ($acoes)");
			foreach ($Rs as $Acao) {
				$this->insert(array(
					'fl_permitido' => 1,
					'id_usuario' => $params['id_usuario'],
					'id_acao' => $Acao['id']
				));
			}

			return true;

		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function canSave($params) {
		if (!$params['id_usuario']) {
			return false;
		}

		//valida somente se for preposto
		$userModel = new Sistema_Model_Usuarios;
		$user = $userModel->fetchRow($userModel->select()->where("id = {$params['id_usuario']}"));
		if ($user->tp_usuario != 'P') {
			return true;
		}

		$prepostoModel = new Sistema_Model_Prepostos;
		$preposto = $prepostoModel->findByUser($params['id_usuario']);
		
		$excecoes = $preposto->ds_excecoes;
		if (!empty($excecoes)) {
			//monta o conjunto de permissões
			$arPermissoes = array();
			$excecoes = explode(',', $preposto->ds_excecoes);
			foreach ($excecoes as $excecao) {
				if (is_array(self::$_RESTRICOES_PREPOSTO[(int)$excecao])) {
					$arPermissoes = array_merge($arPermissoes, self::$_RESTRICOES_PREPOSTO[(int)$excecao]);
				}
			}
			
			//valida e bloqueia o salvamento quando possui uma ação que esteja restrita
			$acoesModel = new Sistema_Model_Acoes;
			foreach ($arPermissoes as $permissao) {
				if (!$acoesModel->temFilhos($permissao) && in_array($permissao, $params['id_acao'])) {
					throw new Zend_Exception("Uma ou mais das permissões selecionadas, estão atreladas a alguma das regras de perfil!", 1);
				}
			}
		}

		return true;
		
	}

	public function setExcecao(array $params) {
		$acoes = implode(',', $params['id_acao']);

		try {
			$Rs = $this->getDefaultAdapter()->fetchAll("select id from sistema.acao where id in ($acoes)");
			$this->getAdapter()->query("delete from sistema.usuarios_acao where id_usuario = ".$params['id_usuario']);
			foreach ($Rs as $Acao) {
				$this->insert(array(
					'fl_permitido' => 1,
					'id_usuario' => $params['id_usuario'],
					'id_acao' => $Acao['id']
				));
			}

			return true;

		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function setBloqueioAcao(array $params) {
		$acoesNaoPermitido = implode(',', $params['id_acao']['nao_permitido']);
		$acoesPermitido = implode(',', $params['id_acao']['permitido']);

		try {
			//ações que o usuário não deve acessar
			$Rs = array();
			if ($acoesNaoPermitido) {
				$Rs = $this->getDefaultAdapter()->fetchAll("select id from sistema.acao where id in ($acoesNaoPermitido)");
			}

			$RsPermitido = array();
			if ($acoesPermitido) {
				$RsPermitido = $this->getDefaultAdapter()->fetchAll("select id from sistema.acao where id in ($acoesPermitido)");
			}

			$this->getAdapter()->query("delete from sistema.usuarios_acao where id_usuario = ".$params['id_usuario']);
			foreach ($Rs as $Acao) {
				$this->insert(array(
					'fl_permitido' => 0,
					'id_usuario' => $params['id_usuario'],
					'id_acao' => $Acao['id']
				));
			}

			//ações que o usuário pode acessar
			foreach ($RsPermitido as $Acao) {
				$this->insert(array(
					'fl_permitido' => 1,
					'id_usuario' => $params['id_usuario'],
					'id_acao' => $Acao['id']
				));
			}

			return true;

		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function verificaAcaoUsuarioPerfil($id_usuario, $id_acao, $fl_permitido) {
		$sql = "
			select
				ra.fl_permitido
			from
				sistema.usuarios u inner join
				sistema.roles_acao ra on u.id_role = ra.id_role
			where
				u.id = $id_usuario and
				ra.id_acao = $id_acao";
		$Db = Agro_Db_Table_Abstract::getDefaultAdapter();
		$Rs = $Db->FetchAll($sql);
		if($Rs) {
			if($Rs[0]['fl_permitido'] != $fl_permitido) {
				return false;
			} else {
				return true;
			}
		} else {
			return false;
		}
	}

	public function setMenuRole($idRole, $menus) {
		$Usuario = new Sistema_Model_Usuarios();

		try {
			if (is_array($menus)) {
				foreach ($menus as $menu) {
					$data = array();
					$data['id_usuario'] = $idRole;
					$data['id_acao'] = $menu;

					$this->insert($data);
				}
			}

			$Rs = $Usuario->fetchAll("id_role = $idRole")->toArray();
			foreach ($Rs as $row) {
				$this->setUserRole($row['id'], $idRole);
			}

			return true;
		} catch (Exception $e) {
			return false;
		}
	}

	public function fetchPrivilegesUsuario($idUsuario=0) {
		if ($idUsuario) {
			$select = $this->select()->distinct();
			$select->setIntegrityCheck(false);
			$select->from(array('a' => 'sistema.acao'), array('*'));
			$select->join(array('ra' => 'sistema.usuarios_acao'), 'ra.id_acao = a.id', 'fl_permitido');
			$select->where("ds_module != ''");
			$select->where("ra.id_usuario = " . $idUsuario);

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

			return $ret;
		}
	}

	public function getExceptions($acoes) {
		$tempAcoes = implode(',',$acoes);
		$Acoes = new Sistema_Model_Acoes();
		$Rs = $Acoes->fetchAll("id NOT IN ($tempAcoes)");

		return $Rs;
	}
}
