/**
 * Convert a raw user agent string to something more readable for most humans.
 *
 * Type:     modifier<br>
 * Name:     user_agent<br>
 *
 * @param string $string input string
 *
 * @return string HTML text
 */
function smarty_modifier_user_agent($string) {
	$ua = new \Core\UserAgent($string);
	return $ua->getAsHTML();
}
	public function now(){
		$request = $this->getPageRequest();
		$view = $this->getView();

		if(!$request->isJSON()) return View::ERROR_BADREQUEST;
		$view->contenttype = View::CTYPE_JSON;
		$view->mode = View::MODE_AJAX;
		$view->record = false;

		$limit = $this->_getQueryLimit();
		$duration = 60;
		// Use FindRaw because it's faster than using full Models for everything, especially when dealing with 20k + records.
		$listings = UserActivityModel::FindRaw('datetime >= ' . (Time::GetCurrent() - $duration), $limit, 'datetime DESC');


		$data = array();

		// Performance reports
		$data['information'] = array(
			'duration' => $duration,
		);
		$data['performance'] = array('get' => 0, 'post' => 0);
		$data['requests'] = array('get' => 0, 'post' => 0);
		$users = array();
		$bots = array();

		$guestname = \ConfigHandler::Get('/user/displayname/anonymous');

		foreach($listings as $log){
			if($log['type'] == 'GET'){
				$data['performance']['get'] += $log['processing_time'];
				$data['requests']['get']++;
			}
			elseif($log['type'] == 'POST'){
				$data['performance']['post'] += $log['processing_time'];
				$data['requests']['post']++;
			}

			$ua = new \Core\UserAgent($log['useragent']);
			
			if(class_exists('\\geocode\\IPLookup')){
				// If the geo library is available, use that to resolve the IP to something more meaningful than just a number.
				$lookup = new \geocode\IPLookup($log['ip_addr']);

				$file = \Core\Filestore\Factory::File('assets/images/iso-country-flags/' . strtolower($lookup->country) . '.png');
				
				if($lookup->province && $lookup->city){
					$title = $lookup->city . ', ' . $lookup->province . ', ' . $lookup->getCountryName();
				}
				elseif($lookup->province){
					$title = $lookup->province . ', ' . $lookup->getCountryName();
				}
				elseif($lookup->city){
					$title = $lookup->city . ' ' . $lookup->getCountryName();
				}
				else{
					$title =  $lookup->getCountryName();
				}

				$ip = '<span title="' . $title . '">';
				if($file->exists()){
					$ip .= '<img src="' . $file->getPreviewURL('20x20') . '" alt="' . $lookup->country . '"/> ';
				}
				$ip .= $log['ip_addr'];
				$ip .= '</span>';
			}
			else{
				$ip = $log['ip_addr'];
			}

			// Bots have their own data, because, well... they're bots.
			// Damn bots!
			if($ua->isBot()){
				if(!isset($bots[ $log['ip_addr'] ])){
					$bots[ $log['ip_addr'] ] = array(
						'ip'        => $ip,
						'useragent' => $log['useragent'],
						'lastpage'  => $log['request'],
						'status'    => $log['status'],
						//'type'      => $ua->,
						'browser'   => $ua->getAsHTML(),
						'count'     => 1,
					);
				}
				else{
					$bots[$log['ip_addr']]['count']++;
				}
			}
			// The user agent information I want to know on a per-user basis, not a per-click basis.
			else{
				if(!isset($users[ $log['session_id'] ])){
					$thisuser = UserModel::Construct($log['user_id']);

					$users[ $log['session_id'] ] = array(
						'session'   => $log['session_id'],
						'ip'        => $ip,
						'user_id'   => $log['user_id'],
						'username'  => ($thisuser ? $thisuser->getDisplayName() : $guestname),
						'useragent' => $log['useragent'],
						'lastpage'  => $log['request'],
						//'type'      => $ua->type,
						'browser'   => $ua->getAsHTML(),
						'os'        => '',
						'count'     => 1,
					);
				}
				else{
					$users[$log['session_id']]['count'] ++;
				}
			}
		}
//UserAgent::Test(); die();
		if($data['requests']['get'] > 0) $data['performance']['get'] = round($data['performance']['get'] /  $data['requests']['get'], 2);
		if($data['requests']['post'] > 0) $data['performance']['post'] = $data['performance']['post'] /  $data['requests']['post'];

		$data['users'] = array_values($users);
		$data['bots'] = array_values($bots);

		//var_dump($data, $users, $listings); die();
		$view->jsondata = $data;
	}
	public function testAgents(){
		$tests = [
			[
				'ua'            => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',
				'browser'       => 'Chrome',
				'version'       => '46.0',
				'major_ver'     => '46',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'Blink',
				'platform'      => 'Windows',
				'platform_ver'  => '7',
				'platform_arch' => 'x86',
				'platform_bits' => '64',
			],
			[
				'ua'            => 'Wget/1.12 (linux-gnu)',
				'browser'       => 'Wget',
				'version'       => '1.12',
				'major_ver'     => '1',
				'minor_ver'     => '12',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => '',
				'platform'      => 'GNU/Linux',
				'platform_ver'  => '',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)',
				'browser'       => 'MJ12 Bot',
				'version'       => '1.4',
				'major_ver'     => '1',
				'minor_ver'     => '4',
				'ismobile'      => false,
				'isbot'         => true,
				'engine'        => '',
				'platform'      => 'unknown',
				'platform_ver'  => '',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
				'browser'       => 'BingBot',
				'version'       => '2.0',
				'major_ver'     => '2',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => true,
				'engine'        => '',
				'platform'      => 'unknown',
				'platform_ver'  => '',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)',
				'browser'       => 'Baidu Spider',
				'version'       => '2.0',
				'major_ver'     => '2',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => true,
				'engine'        => '',
				'platform'      => 'unknown',
				'platform_ver'  => '',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Core Plus 4.2.0 (http://corepl.us)',
				'browser'       => 'Core Plus',
				'version'       => '4.2',
				'major_ver'     => '4',
				'minor_ver'     => '2',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => '',
				'platform'      => 'unknown',
				'platform_ver'  => '',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
				'browser'       => 'Internet Explorer',
				'version'       => '6.0',
				'major_ver'     => '6',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'Trident',
				'platform'      => 'Windows',
				'platform_ver'  => 'XP',
				'platform_arch' => 'x86',
				'platform_bits' => '32',
			],
			[
				'ua'            => 'Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2',
				'browser'       => 'Firefox',
				'version'       => '6.0',
				'major_ver'     => '6',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'Gecko',
				'platform'      => 'Windows',
				'platform_ver'  => 'XP',
				'platform_arch' => 'x86',
				'platform_bits' => '32',
			],
			[
				'ua'            => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2202.3 Safari/537.36',
				'browser'       => 'Chrome',
				'version'       => '40.0',
				'major_ver'     => '40',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'Blink',
				'platform'      => 'GNU/Linux',
				'platform_ver'  => '',
				'platform_arch' => 'x86',
				'platform_bits' => '64',
			],
			[
				'ua'            => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36',
				'browser'       => 'Chrome',
				'version'       => '27.0',
				'major_ver'     => '27',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'WebKit',
				'platform'      => 'Windows',
				'platform_ver'  => '7',
				'platform_arch' => 'x86',
				'platform_bits' => '64',
			],
			[
				'ua'            => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0',
				'browser'       => 'Firefox',
				'version'       => '21.0',
				'major_ver'     => '21',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'Gecko',
				'platform'      => 'Windows',
				'platform_ver'  => '7',
				'platform_arch' => 'x86',
				'platform_bits' => '64',
			],
			[
				'ua'            => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13',
				'browser'       => 'Safari',
				'version'       => '6.0',
				'major_ver'     => '6',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'WebKit',
				'platform'      => 'MacOSX',
				'platform_ver'  => '10.8.3',
				'platform_arch' => 'x86',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0',
				'browser'       => 'Firefox',
				'version'       => '21.0',
				'major_ver'     => '21',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'Gecko',
				'platform'      => 'Ubuntu',
				'platform_ver'  => '',
				'platform_arch' => 'x86',
				'platform_bits' => '64',
			],
			[
				'ua'            => 'Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25',
				'browser'       => 'Mobile Safari',
				'version'       => '6.0',
				'major_ver'     => '6',
				'minor_ver'     => '0',
				'ismobile'      => true,
				'isbot'         => false,
				'engine'        => 'WebKit',
				'platform'      => 'iOS',
				'platform_ver'  => '6.1.3',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25',
				'browser'       => 'Mobile Safari',
				'version'       => '6.0',
				'major_ver'     => '6',
				'minor_ver'     => '0',
				'ismobile'      => true,
				'isbot'         => false,
				'engine'        => 'WebKit',
				'platform'      => 'iOS',
				'platform_ver'  => '6.1.3',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36',
				'browser'       => 'Chrome',
				'version'       => '27.0',
				'major_ver'     => '27',
				'minor_ver'     => '0',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'WebKit',
				'platform'      => 'GNU/Linux',
				'platform_ver'  => '',
				'platform_arch' => 'x86',
				'platform_bits' => '64',
			],
			[
				'ua'            => 'Mozilla/5.0 (Linux; Android 4.1.1; GT-I9300 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
				'browser'       => 'Android Browser',
				'version'       => '4.0',
				'major_ver'     => '4',
				'minor_ver'     => '0',
				'ismobile'      => true,
				'isbot'         => false,
				'engine'        => 'WebKit',
				'platform'      => 'Android',
				'platform_ver'  => '4.1.1',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0',
				'browser'       => 'Firefox',
				'version'       => '26.0',
				'major_ver'     => '26',
				'minor_ver'     => '0',
				'ismobile'      => true,
				'isbot'         => false,
				'engine'        => 'Gecko',
				'platform'      => 'Firefox OS',
				'platform_ver'  => '',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Googlebot/2.1 ( http://www.googlebot.com/bot.html) ',
				'browser'       => 'Googlebot',
				'version'       => '2.1',
				'major_ver'     => '2',
				'minor_ver'     => '1',
				'ismobile'      => false,
				'isbot'         => true,
				'engine'        => '',
				'platform'      => 'unknown',
			    'platform_ver'  => '',
			    'platform_arch' => '',
			    'platform_bits' => '',
			],
			[
				'ua'            => 'Lynx/2.8.7rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8r',
				'browser'       => 'Lynx',
				'version'       => '2.8',
				'major_ver'     => '2',
				'minor_ver'     => '8',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'libwww-FM',
				'platform'      => 'unknown',
				'platform_ver'  => '',
				'platform_arch' => '',
				'platform_bits' => '',
			],
			[
				'ua'            => 'Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.1',
				'browser'       => 'Iceweasel',
				'version'       => '38.2',
				'major_ver'     => '38',
				'minor_ver'     => '2',
				'ismobile'      => false,
				'isbot'         => false,
				'engine'        => 'Gecko',
				'platform'      => 'GNU/Linux',
				'platform_ver'  => '',
				'platform_arch' => 'x86',
				'platform_bits' => '64',
			],
		];

		foreach($tests as $test){
			$ua = new \Core\UserAgent($test['ua']);

			$this->assertEquals($test['browser'], $ua->browser, 'Browser match failed for UA ' . $test['ua']);
			$this->assertEquals($test['version'], $ua->version, 'Version match failed for UA ' . $test['ua']);
			$this->assertEquals($test['major_ver'], $ua->major_ver, 'Version (Major String) match failed for UA ' . $test['ua']);
			$this->assertEquals($test['minor_ver'], $ua->minor_ver, 'Version (Minor String) match failed for UA ' . $test['ua']);

			$this->assertEquals($test['ismobile'], $ua->isMobile(), 'IsMobile match failed for UA ' . $test['ua']);
			$this->assertEquals($test['isbot'], $ua->isBot(), 'IsBot match failed for UA ' . $test['ua']);

			$this->assertEquals($test['engine'], $ua->rendering_engine_name, 'Engine match failed for UA ' . $test['ua']);

			$this->assertEquals($test['platform'], $ua->platform, 'OS match failed for UA ' . $test['ua']);
			$this->assertEquals($test['platform_ver'], $ua->platform_version, 'OS (Version) match failed for UA ' . $test['ua']);
			$this->assertEquals($test['platform_arch'], $ua->platform_architecture, 'OS (Architecture) match failed for UA ' . $test['ua']);
			$this->assertEquals($test['platform_bits'], $ua->platform_bits, 'OS (Bits) match failed for UA ' . $test['ua']);
		}
	}