<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/


include_once LAB_PATH_KERNEL.'/classes/AuthInterface.php';

class login_auth implements AuthInterface
{
	protected $module='login';
	public $user;
	protected $users=array(-1=>-1);
	
	function __construct()
	{
		$user_id=isset($_SESSION['user_id'])?$_SESSION['user_id']:null;
		$user=Factory::create('user', $user_id);
		if ($user->isActiveUser()) $this->setCurrentUser($user);
		else $this->setGuest();
	}
	
	public function __set($key, $value)
	{
		$this->user->$key=$value;
	}
	
	public function __get($key)
	{
		return $this->user->$key;
	}
	
	/**
	 * Авторизует пользователя по данным кук
	 * 
	 * @return none    
	 */
	public function autologin()
	{
		if ($this->user->isGuest() && isset($_COOKIE['autologin'])) {
			$autologin=explode('-', $_COOKIE['autologin']);
			$user=Factory::create('user');
			$user->loadUserDataById($autologin[0]);
			if ($user->isActiveUser() && $user->autologin==$autologin[1]) {
				$this->setCurrentUser($user);
				$this->_storeLastIP();
			}
			else
				$this->user->DeleteCookieAuth();
		}
	}
	
	public function setCurrentUser($user)
	{
		$this->user=$user;
		$_SESSION['user_id']=$this->user->id;
		//эта переменная только для отладки
		$_SESSION['allow_debug']=(1==$this->user->group_id);
	}
	
	/**
	 * Устанавливает дополнительную информацию о пользователе, если таковая необходима
	 */
	public function setUserData()
	{
		
	}

	/**
	 * Разлогинивание. Уничтожает данные текущей сессии. Обнуляет куки с автологином.
	 */
	public function logout()
	{
		$this->user->DeleteCookieAuth();
		$this->setGuest();
	}
	
	/**
	 * проверка существования логина в БД
	 * заменяет по очереди все русские на английские аналоги, потом все английские на русские
	 * @param string	проверяемый логин
	 * @return integer
	 */	
	public function isLoginExists($login)
	{
		$eng=array('a', '6', 'e', 'k', 'o', 'p', 'c', 'y', 'x', 'A', 'B', 'E', 'K', 'M', 'H', 'O', 'P', 'C', 'T', 'X');
		$rus=array('а', 'б', 'е', 'к', 'о', 'р', 'с', 'у', 'х', 'А', 'В', 'Е', 'К', 'М', 'Н', 'О', 'Р', 'С', 'Т', 'Х');
		$login=preg_replace('/\s+/', ' ', trim($login));
		$result[]=str_replace($eng, $rus, $login);
		$result[]=str_replace($rus, $eng, $login);
		return $this->_CountUsersByLogins($result);
	}

	/**
	 * Возвращает количество найденных пользователей с указанными логинами
	 * 
	 * @param array $logins массив логинов
	 * 
	 * @return Int    количество найденных совпадений
	 */	
	protected function _CountUsersByLogins($logins)
	{
		return Db::i()->selectCell(
			"SELECT COUNT(user_id)
			FROM ?_users
			WHERE login IN (?a) AND user_id!=?", $logins, IS_GUEST
		);
	}
	
	/**
	 * Сохраняет в базе ip, с которого производилась последняя авторизация
	 * 
	 * @return none    
	 */
	protected function _storeLastIP()
	{
		$this->user->update(array('last_ip'=>inet_pton(User::getIP())));
	}
	
	/**
	 * Переносит в основную таблицу дату последнего обращения пользователей покинувших сайт
	 * 
	 * @param int $maxlifetime интервал в пределах которого пользователь считается "на сайте"
	 * 
	 * @return none    
	 */
	public function saveLastRequests($maxlifetime)
	{
		$users=Db::i()->selectCol(
			"SELECT user_id FROM ?_users_online
			WHERE request_time<?d", (time()-$maxlifetime)
		);
		if ($users) {
			Db::i()->query(
				"UPDATE ?_users u
				LEFT JOIN ?_users_online o
				ON u.user_id=o.user_id
				SET u.last_visit=o.request_time
				WHERE o.user_id IN(?a)", $users
			);
			$this->user->resetCache($users);
		}
	}
	
	/**
	 * делает текущего пользователя гостем
	 * 
	 * @return none    
	 */
	public function setGuest()
	{
		$this->setCurrentUser(User::getUser());
	}
	
	public function getCurrent()
	{
		return $this->user;
	}
}