<?php 

	require_once("__system__/autoloader.php");

	create_htaccess();
	create_manifest_json();
	create_secret_key();

	ob_start();

	try{
		if ((empty(get_session("HTTP_USER_AGENT")) or !exist_session("HTTP_USER_AGENT")) and (empty(get_session("REMOTE_ADDR")) or !exist_session("REMOTE_ADDR"))) {
			set_session("HTTP_USER_AGENT", $_SERVER["HTTP_USER_AGENT"]);
			set_session("REMOTE_ADDR", $_SERVER["REMOTE_ADDR"]);
		}

		if (empty(get_session("CSRF_TOKEN")) or !exist_session("CSRF_TOKEN")) {
			set_session("CSRF_TOKEN", create_token());
		}
		
		if (exist_session("LAST_ACTIVITY") and (time() - get_session("LAST_ACTIVITY")) > MAX_SESSION_TIME) {
			destroy_session();
		}

		set_session("LAST_ACTIVITY", time());

		if (ENVIRONMENT == "PRODUCTION") {
			if (get_session("HTTP_USER_AGENT") != $_SERVER["HTTP_USER_AGENT"] or get_session("REMOTE_ADDR") != $_SERVER["REMOTE_ADDR"]) {
				destroy_session();
			}
		}

		if (exist_page()) {
			if (have_authentication_permission()) {
				if (have_method_permission() and validate_csrf()) {
					set_headers_configs();
					require_once(get_page());
				}
				else{
					show_403();
				}
			}
			else{
				require_once(DIR_PAGES."login/login.php");
			}
		}
		else{
			show_404();
		}

		ob_end_flush();
	}
	catch (Throwable $e) {
		ob_end_clean();

		http_response_code(($e->getCode() == 0) ? 500 : $e->getCode());

		if ((isset($_SERVER["HTTP_X_REQUESTED_WITH"]) and strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) == "xmlhttprequest") or strpos($_SERVER["HTTP_ACCEPT"], "application/json") !== false) {
			switch ($e->getCode()) {
				case 403:
					echo json_encode([
						"status" => "error",
						"message" => "ERRO 403: Acesso negado, você não tem autorização para acessar esta página!"
					]);
					break;
				case 404:
					echo json_encode([
						"status" => "error",
						"message" => "ERRO 404: A página que você está procurando não foi encontrada!"
					]);
					break;
				case 500:
					if (DEBUG == true) {
						echo json_encode([
							"status" => "error",
							"message" => "ERROR CODE: {$e->getCode()}<br>{$e->getMessage()}"
						]);
						break;
					}
					else{
						echo json_encode([
							"status" => "error",
							"message" => "ERRO 500: Erro interno no sistema!"
						]);
						break;
					}
				case 503:
					echo json_encode([
						"status" => "error",
						"message" => "ERRO 503: Estamos em manutenção neste exato momento, tente mais tarde!"
					]);
				default:
					echo json_encode([
						"status" => "error",
						"message" => "ERROR CODE: {$e->getCode()}<br>{$e->getMessage()}"
					]);
					break;
			}
		}
		else{
			header("Content-Type: text/html; charset=UTF-8");
			
			if ($e->getCode() == 403 or $e->getCode() == 404 or $e->getCode() == 500 or $e->getCode() == 503) {
				require_once(get_error_page($e->getCode()));
			}
			else{
				require_once(get_error_page("500"));
			}
		}

		if (LOGS == true) {
			create_log($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
		}
	}

?>