<?php
/*****************************************************************************
 * Dispatcher.php
 * Contains key class Dispatcher.
 *
 * Kabuki CMS (C) 2013-2015, Aaron van Geffen
 *****************************************************************************/

class Dispatcher
{
	public static function dispatch()
	{
		// Let's try to find our bearings!
		try
		{
			$page = Router::route();
			$page->showContent();
		}
		// Something wasn't found?
		catch (NotFoundException $e)
		{
			self::trigger404();
		}
		// Or are they just sneaking into areas they don't belong?
		catch (NotAllowedException $e)
		{
			if (Registry::get('user')->isGuest())
				self::kickGuest();
			else
				self::trigger403();
		}
		catch (UserFacingException $e)
		{
			$debug_info = ErrorHandler::getDebugInfo($e->getTrace());
			ErrorHandler::display($e->getMessage(), $debug_info, false);
		}
		catch (Exception $e)
		{
			ErrorHandler::handleError(E_USER_ERROR, 'Unspecified exception: ' . $e->getMessage(), $e->getFile(), $e->getLine());
		}
		catch (Error $e)
		{
			ErrorHandler::handleError(E_USER_ERROR, 'Fatal error: ' . $e->getMessage(), $e->getFile(), $e->getLine());
		}
	}

	public static function errorPage($title, $body)
	{
		$page = new MainTemplate($title);
		$page->adopt(new ErrorPage($title, $body));

		if (Registry::get('user')->isAdmin())
		{
			$page->appendStylesheet(BASEURL . '/css/admin.css');
		}

		$page->html_main();
	}

	/**
	 * Kicks a guest to a login form, redirecting them back to this page upon login.
	 */
	public static function kickGuest($title = null, $message = null)
	{
		$form = new LogInForm('Log in');
		$form->adopt(new Alert($title ?? '', $message ?? 'You need to be logged in to view this page.', 'danger'));
		$form->setRedirectUrl($_SERVER['REQUEST_URI']);

		$page = new MainTemplate('Login required');
		$page->appendStylesheet(BASEURL . '/css/admin.css');
		$page->adopt($form);
		$page->html_main();
		exit;
	}

	private static function trigger400()
	{
		http_response_code(400);
		self::errorPage('Bad request', 'The server does not understand your request.');
		exit;
	}

	private static function trigger403()
	{
		http_response_code(403);
		self::errorPage('Forbidden', 'You do not have access to this page.');
		exit;
	}

	private static function trigger404()
	{
		http_response_code(404);
		$page = new ViewErrorPage('Page not found!');
		$page->showContent();
	}
}