<?php

class User extends PhpObject {
	
	//DB Tables
	const USER_TABLE = 'users';
	
	//Cookie
	const COOKIE_ID_USER = 'subscriber';
	const COOKIE_DURATION = 60 * 60 * 24 * 365; //1 year
	/**
	 * Database Handle
	 * @var Db
	 */
	private $oDb;
	
	//User Info
	private $iUserId;
	private $asUserInfo;
	
	public function __construct(Db &$oDb) {
		parent::__construct(__CLASS__, Settings::DEBUG);
		$this->oDb = &$oDb;
		$this->iUserId = 0;
		$this->asUserInfo = array(Db::getId(self::USER_TABLE)=>0, 'name'=>'', 'email'=>'', 'language'=>'', 'timezone'=>'', 'active'=>'0');
		$this->checkUserCookie();
	}
	
	public function getLang() {
		return $this->asUserInfo['language'];
	}
	
	public function addUser($sEmail, $sLang, $sTimezone) {
		$bSuccess = false;
		$sDesc = '';
		$sEmail = trim($sEmail);
		
		//Check Email availability
		$iUserId = $this->oDb->selectValue(self::USER_TABLE, Db::getId(self::USER_TABLE), array('email'=>$sEmail, 'active'=>'1'));
		
		if($iUserId > 0) {
			//Log user in
			$sDesc = 'lang:nl_email_exists';
			$bSuccess = true;
		}
		else {
			//Add/Reactivate user
			$iUserId = $this->oDb->insertUpdateRow(self::USER_TABLE, array('email'=>$sEmail, 'language'=>$sLang, 'timezone'=>$sTimezone, 'active'=>'1'), array('email'));
			if($iUserId==0) $sDesc = 'lang:error_commit_db';
			else {
				$sDesc = 'lang:nl_subscribed';
				$bSuccess = true;
			}
		}

		//Set Cookie (valid 1 year)
		if($bSuccess) {
			$this->setUserId($iUserId);
			$this->updateCookie(self::COOKIE_DURATION);
		}
		
		return Spot::getResult($bSuccess, $sDesc);
	}
	
	public function removeUser() {
		$bSuccess = false;
		$sDesc = '';
		
		if($this->iUserId > 0) {
			$iUserId = $this->oDb->updateRow(self::USER_TABLE, $this->iUserId, array('active'=>'0'));
			if($iUserId==0) $sDesc = 'lang:error_commit_db';
			else {
				$sDesc = 'lang:nl_unsubscribed';
				$this->updateCookie(-60 * 60); //Set Cookie in the past, deleting it
				$bSuccess = true;
			}
		}
		else $sDesc = 'lang:nl_unknown_email';
		
		return Spot::getResult($bSuccess, $sDesc);
	}
	
	public function updateNickname($sNickname) {
		if($this->iUserId > 0 && $sNickname!='') $this->oDb->updateRow(self::USER_TABLE, $this->iUserId, array('name'=>$sNickname));
	}
	
	private function checkUserCookie() {
		if(isset($_COOKIE[self::COOKIE_ID_USER])){
			$this->setUserId($_COOKIE[self::COOKIE_ID_USER]);
			
			//Extend cookie life
			if($this->iUserId > 0) $this->updateCookie(self::COOKIE_DURATION);
		}
	}
	
	public function getUserId() {
		return $this->iUserId;
	}
	
	public function setUserId($iUserId) {
		$this->iUserId = 0;
		
		$asUser = $this->getActiveUsersInfo($iUserId);
		if(!empty($asUser)) {
			$this->iUserId = $iUserId;
			$this->asUserInfo = array_shift($asUser); 
		}
	}
	
	public function getUserInfo() {
		return $this->asUserInfo;
	}
	
	public function getActiveUsersInfo($iUserId=-1) {
		$asInfo = array(
			'select'	=> array_keys($this->asUserInfo),
			'from'		=> self::USER_TABLE,
			'constraint'=> array('active'=>'1')
		);
		if($iUserId != -1) $asInfo['constraint'][Db::getId(self::USER_TABLE)] = $iUserId;
		
		return $this->oDb->selectRows($asInfo);
	}
	
	private function updateCookie($iDeltaTime) {
		setcookie(self::COOKIE_ID_USER, ($iDeltaTime < 0)?'':$this->iUserId, array('samesite' => 'Lax', 'expires' => time() + $iDeltaTime));
	}
}