<?php  

class PermissionModel
{
	private $bID;
	private $db;
	private $dbTable;
	
	private static $permissionCache = array();
	
	public function __construct($bID, $db, $dbTable)
	{
		$this->bID = $bID;
		$this->db = $db;
		$this->dbTable = $dbTable;
	}
	
	public function CanRead($u)
	{
		return $this->hasRights($u, 'readrights');
	}

	public function CanEdit($u)
	{
		return $this->hasRights($u, 'editrights');
	}
	
	private function hasRights($u, $field)
	{
		if($u->isSuperUser()) return true;
		
		$cached = self::isCached($this->bID, $u, $field);
		if($cached !== null) return $cached;
		
		$rights = $this->db->GetOne("SELECT $field FROM $this->dbTable WHERE bID = ?", array($this->bID));
		
		$rights = explode(',', $rights);		
		$rights[] = ADMIN_GROUP_ID; // Always add the Administrators group.

		// Guest user access
		if(!$u->isRegistered() && in_array(GUEST_GROUP_ID, $rights))
			return self::cache($this->bID, $u, $field, true);

		$result = count(array_intersect($rights, array_keys($u->getUserGroups()))) > 0;
			
		return self::cache($this->bID, $u, $field, $result);
	}
	
	private static function isCached($bID, $u, $field)
	{
		return isset(self::$permissionCache[$bID][$u->getUserID()][$field]) 
			? self::$permissionCache[$bID][$u->getUserID()][$field]
			: null;
	}
	
	private static function cache($bID, $u, $field, $result)
	{
		self::$permissionCache[$bID][$u->getUserID()][$field] = $result;
		return $result;
	}
}