<?php

namespace Vn\Hedera;

require_once ('vn/hedera/init.php');
require_once ('vn/db/db.php');
require_once ('vn/web/auth.php');
require_once ('vn/web/locale.php');
require_once ('vn/hedera/util.php');

use Vn\Db\Conn;
use Vn\Web\Locale;
use Vn\Web\Auth;

class Web
{
	static $sysConn = NULL;
	static $conn = NULL;

	/**
	 * Initializes the Hedera web library.
	 **/
	static function init ()
	{
		if (self::isHttps ())
			ini_set ('session.cookie_secure', TRUE);
	
		session_start ();
		
		// Setting the locale

		Locale::init ();

		// Registering the visit

		if (!isset ($_COOKIE['PHPSESSID'])
		|| isset ($_SESSION['access'])
		|| isset ($_SESSION['skipVisit']))
			return;

		$agent = $_SERVER['HTTP_USER_AGENT'];
		$browser = get_browser ($agent, TRUE);
		
		if (isset ($browser['crawler']) && $browser['crawler'])
		{
			$_SESSION['skipVisit'] = TRUE;
			return;
		}

		if (isset ($_SERVER['REMOTE_ADDR']))
			$ip = ip2long ($_SERVER['REMOTE_ADDR']);

		self::sysInit ();

		$row = self::$sysConn->getRow (
			'CALL visit_register (#, #, #, #, #, #, #, #, #)',
			[
				 nullIf ($_COOKIE, 'hedera_visit')
				,nullIf ($browser, 'platform')
				,nullIf ($browser, 'browser') 
				,nullIf ($browser, 'version')
				,nullIf ($browser, 'javascript')
				,nullIf ($browser, 'cookies')
				,isset ($agent) ? $agent : NULL
				,isset ($ip) && $ip ? $ip : NULL
				,nullIf ($_SERVER, 'HTTP_REFERER')
			]
		);

		if (isset ($row['access']))
		{
			setcookie ('hedera_visit', $row['visit'], time () + 31536000); // 1 Year
			$_SESSION['access'] = $row['access'];
		}
		else
			$_SESSION['skipVisit'] = TRUE;
	}
	
	/**
	 * Opens the system database connection.
	 **/
	static function sysInit ()
	{
		global $conf;

		if (self::$sysConn)
			return;
	
		self::$sysConn = new Conn ();
		self::$sysConn->open (
			'p:'. $conf['db']['host']
			,$conf['db']['user']
			,base64_decode ($conf['db']['pass'])
			,$conf['db']['schema']
			,$conf['db']['port']
		);
	}
	
	static function isHttps ()
	{
		return isset ($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on';
	}
	
	/**
	 * Obtains the version of the library.
	 **/
	static function getVersion ()
	{
		return (int) filectime (__FILE__);
	}

	static function login ()
	{
		global $conf;
	
		$wasLoged = Auth::isLogged ();
		$useCookies = TRUE;
		$success = TRUE;
		
		if (isset ($_GET['guest']))
		{
			$row = self::$sysConn->getRow (
				'SELECT guest_user, guest_pass FROM config');

			if ($row)
			{
				$_POST['user'] = $row['guest_user'];
				$_POST['password'] = base64_decode ($row['guest_pass']);
				$useCookies = FALSE;
			}
		}

		try {
			Auth::getCredentials ();

			self::$conn = new Conn ();
			self::$conn->open (
				 $conf['db']['host']
				,Auth::getUser ()
				,Auth::getPassword ()
				,$conf['db']['schema']
				,$conf['db']['port']
			);
			self::$conn->query ('CALL user_session_start (#)',
				[session_id ()]);

			Auth::login ($useCookies);
		}
		catch (\Exception $e)
		{
			self::$conn = NULL;
			$success = FALSE;
		}

		// Registering the user access

		if ($success && !$wasLoged)
			unset ($_SESSION['visitUser']);

		if (isset ($_SESSION['access'])
		&& !isset ($_SESSION['visitUser']))
		{
			self::sysInit ();

			$_SESSION['visitUser'] = self::$sysConn->getValue (
				'CALL visit_user_new (#, #, #)',
				[
					 $_SESSION['access']
					,nullIf ($_SESSION, 'visitUser')
					,session_id ()
				]
			);
		
			if (!isset ($_SESSION['visitUnknown']) && !$success)
				$_SESSION['visitUnknown'] = $_SESSION['visitUser'];
		}

		return $success;
	}

	static function deinit ()
	{
		if (self::$conn)
			self::$conn->query ('CALL user_session_end ()');
	}
	
	static function logout ()
	{
		$_SESSION['visitUser'] = nullIf ($_SESSION, 'visitUnknown');
		Auth::logout ();
		
		if (self::$conn)
		{
			self::$conn->query (
				'DELETE FROM user_session_view '
				 .'WHERE connection_id = CONNECTION_ID()'
			);

			self::$conn->close ();
			self::$conn = NULL;
		}
	}
}

?>
