[
        'displayErrorDetails' => true,
    ],
];
prof_flag("Init Cache");
$cache = new FileCache();
$configuration['notFoundHandler'] = function ($c) {
	return function ($request, $response) use ($c) {
		
		header("HTTP/1.1 404 Not Found");
		$message = "Page not found!";
		include("templates/error.php");
		die();
	};
};
$c = new \Slim\Container($configuration);
$app = new \Slim\App($c);
$app->get('/', function (Request $request, Response $response) {
	
    global $cache;
    prof_flag("Enter /");
    
	$currentuser = getcurrentuser();
	
	if ($currentuser->userid == -1 && empty($_GET)){
	    $cache_file = "./cache-index.html";
	    //print("cache");
	    if (file_exists($cache_file)) {
	        $cached = file_get_contents($cache_file);
	        if (strlen($cached) > 500){
	            print($cached);
    	        print("Cache was last modified: " . date ("F d Y H:i:s.", filemtime($cache_file)) ."");
    	        die();
	        }
	    }
	}
	
	$tab = $request->getParam('tab');
	$sections = $request->getParam('s');
	
	$valid_sections= array("cs","bio", "ph");
	$sections = implode(",",array_intersect($valid_sections,explode(',',$sections)));
	
	$page = 1*$request->getParam('page', 0);
	$page = max($page,1);
	//print $page;
	if ($tab == "recent"){
	    $key = "getRecentVignettes 5, $page, $sections";
	    if (!$vignettes = $cache->fetch($key)) {
	       $vignettes = getRecentVignettes(5, $page, $sections);
	       $cache->store($key,$vignettes,1440);
	    }
	}else if($tab == "best"){
	    $key = "getBestVignettes 5, $page, $sections";
	    if (!$vignettes = $cache->fetch($key)) {
	       $vignettes = getBestVignettes(5, $page, $sections);
	       $cache->store($key,$vignettes,1440);
	    }
	}else{
		$tab = ""; // to prevent XSS
	    $key = "getPopularVignettes 5, $page, $sections, 1";
	    if (!$vignettes = $cache->fetch($key)) {
	       $vignettes = getPopularVignettes(5, $page, $sections, 1);
	       $cache->store($key,$vignettes,1440);
	    }
	}
		
	prof_flag("Render page");
	
	include("templates/home.php");
	
	prof_flag("Done");
	prof_print();
	die();
});
$app->get('/welcome', function (Request $request, Response $response) {
	include("templates/welcome.php");
	die();
});
$app->get('/search', function (Request $request, Response $response) {
	$term = $request->getParam('term');
	die("Internal search disabled");
	$results = performSearch($term);
	
	//print_r($results);
	
	// don't index search results
	$extraheader = '';
	
	include("templates/papers.php");
	die();
});
$app->get('/internalsearch', function (Request $request, Response $response) {
	$q = $request->getParam('q');
	//print_r($results);
	// don't index search results
	$extraheader = '';
	include("templates/internalsearch.php");
	die();
});
// $app->get('/papers', function (Request $request, Response $response) {
// 	getPapers();
// });
$app->get('/paper', function (Request $request, Response $response) {
	
	$bibtexKey = $request->getParam('bibtexKey');
	
	$code = $request->getParam('code');
	
	$authorfocus = $request->getParam('a');
	
	$paper = getPaper($bibtexKey);
	
	//When no paper is found redirect
	if (!isset($paper->bibtexKey)){
	
		header("HTTP/1.1 303 See Other");
		header("Location: ./search?term=".$bibtexKey);
		die();
	}
	
	
	$currentuser = getcurrentuser();
	
	if (($paper->bibtexKey != "") && ($bibtexKey != "" && $bibtexKey) != ($paper->bibtexKey)){
		
		$vignettes = getVignettes($bibtexKey);
		
		// if there are no entries here then redirect to the better page
		// otherwise just continue with the one that was linked
		if (sizeof($vignettes) == 0){
			
			header("HTTP/1.1 303 See Other");
			header("Location: ./paper?bibtexKey=".$paper->bibtexKey);
			
			//header("Refresh: 0; url=./paper?bibtexKey=".$paper->bibtexKey);
			die();
		}else{
			$paper->bibtexKey = $bibtexKey;
		}
	}
	
	$vignettes = getVignettes($paper->bibtexKey, $code=$code);
	
	for ($v = 0; $v < sizeof($vignettes); $v++){
	
		$vignette = $vignettes[$v];
	
		$vignette->myvote = getMyVignettesVote($vignette->paperid, $vignette->userid);
	
		if (!isset($vignette->vote)) $vignette->vote = 0;
	
		//print_r($vignette);
	
		if($vignette->userid == $currentuser->userid){
			
			$myvignette = $vignette;
			//print_r($myvignette);
		}
	}
	
	// set first vignette to be this variable for the header
	if (sizeof($vignettes) > 0){
	    $vignette = $vignettes[0];
	}
	
	if (!isset($myvignette)){
		
		$myvignette = (object)[];
		$myvignette->paperid = $paper->bibtexKey;
		$myvignette->userid=getcurrentuser()->userid;
		$myvignette->username=getcurrentuser()->username;
		$myvignette->displayname=getcurrentuser()->displayname;
		$myvignette->email=getcurrentuser()->email;
		$myvignette->vote=0;
		$myvignette->myvote=0;
	}
	
	// if no summaries then don't be in the search results
	if (sizeof($vignettes) == 0){
		header("HTTP/1.1 203 No Summaries Yet");
		$extraheader = '';
	}
		
	include("templates/paper.php");
	
	logVisit($paper->bibtexKey);
	die();
});
$app->get('/random', function (Request $request, Response $response) {
	$currentuser = getcurrentuser();
		
	$vignettes = getOneRandomVignette();
	
	//print_r($vignettes);
	
	$bibtexKey = $vignettes[0]->paperid;
	
	header("HTTP/1.1 303 See Other");
	header("Location: ./paper?bibtexKey=".$bibtexKey);
	//header("Refresh: 0; url=$DEFAULTBASEURL/paper?bibtexKey=$bibtexKey");
	die();
});
$app->post('/vignette', function (Request $request, Response $response) {
	
	$vignette = (object)[];
	$vignette->paperid = $request->getParam('paperid');
	$vignette->text = $request->getParam('text');
	$vignette->priv = $request->getParam('priv');
	$vignette->anon = $request->getParam('anon');
	$vignette->userid=getcurrentuser()->userid;
	
	addVignette($vignette);
	
	echo "{}";
	die();
});
$app->delete('/vignette', function (Request $request, Response $response) {
	$userid = $request->getParam('userid');
	
	if (getcurrentuser()->userid != $userid){
		http_response_code(401);
		die(); 
	}
	
	$vignette = (object)[];
	$vignette->paperid = $request->getParam('paperid');
	$vignette->userid = $userid;
	delVignette($vignette);
	
	echo "{}";
	die();
});
$app->post('/vote', function (Request $request, Response $response) {
	$vote = (object)[];
	$vote->vote = $request->getParam('vote');
	$vote->paperid = $request->getParam('paperid');
	$vote->userid = $request->getParam('userid');
	voteVignette($vote);
	
	echo "{}";
	die();
});
$app->post('/comment', function (Request $request, Response $response) {
    $comment = (object)[];
    $comment->text = $request->getParam('text');
    $comment->paperid = $request->getParam('paperid');
    $comment->summaryuserid = $request->getParam('summaryuserid');
    addComment($comment);
    echo "{}";
    die();
  });
$app->delete('/comment', function (Request $request, Response $response) {
    $comment = (object)[];
    $comment->commentid = $request->getParam('commentid');
    delComment($comment);
    echo "{}";
    die();
  });
$app->get('/user', function (Request $request, Response $response) {
	$name = $request->getParam('name');
	$tab = $request->getParam('tab');
	$currentuser = getcurrentuser();
	
	if ($name == "" && $currentuser->userid == -1){
		header("HTTP/1.1 303 See Other");
		header("Location: ./login");
		//header("Refresh: 0; url=$DEFAULTBASEURL/login");
		die();
	}else if ($name == ""){
		header("HTTP/1.1 303 See Other");
		header("Location: ./user?name=".$currentuser->username);
		//header("Refresh: 0; url=$DEFAULTBASEURL/user?name=".$currentuser->username);
		die();
	}
	$user = getuser($name);
	
	$vignettes = getUsersVignettes($user->userid);
	
	if ($currentuser->userid == $user->userid){
	
		$likedvignettes = getUsersLikedVignettes($user->userid);
		$dislikedvignettes = getUsersDisLikedVignettes($user->userid);
	}
	
	$title = htmlspecialchars(($user->displayname)?$user->displayname:$user->username)."'s profile";
	
	if ($user->description == ""){
		$description = "Here are summaries of research papers by user ".htmlspecialchars(($user->displayname)?$user->displayname:$user->username);
	}else{
		$description = htmlspecialchars($user->description);
	}
	
	// we don't want this overview page showing up
	$extraheader = '';
		
	include("templates/user.php");
	die();
});
$app->get('/settings', function (Request $request, Response $response) {
	$name = $request->getParam('name');
	$tab = $request->getParam('tab');
	$currentuser = getcurrentuser();
	if ($name == "" && $currentuser->userid == -1){
		header("HTTP/1.1 303 See Other");
		header("Location: ./login");
		die();
	}
	$user = $currentuser;
	$title = "Settings";
	// we don't want this overview page showing up
	$extraheader = '';
	include("templates/settings.php");
	die();
});
$app->get('/venue', function (Request $request, Response $response) {
    
    global $cache;
    prof_flag("Enter /venue");
	$key = $request->getParam('key');
	$year = $request->getParam('year');
	if ($key == ""){
		
	    prof_flag("getVenues");
	    $cachekey = "getVenues";
	    if (!$venues = $cache->fetch($cachekey)) {
		  $venues = getVenues();
		  $cache->store($cachekey,$venues,2880);
	    }
		
		$title = "All venues with summaries";
		$description = "Browse papers with summaries from these conferences.";
		include("templates/allvenues.php");
		
	}else{
	    
	    prof_flag("getTopVenueVignettes");
	    $cachekey = "getTopVenueVignettes, $key, $year";
	    if (!$years = $cache->fetch($cachekey)) {
	        $years = getTopVenueVignettes($key, $year);
	        $cache->store($cachekey,$years,2880);
	    }
		
	    prof_flag("krsort");
		// if no year pick most recent year
		krsort($years);
		reset($years);
		$defaultyear = key($years);
		if ($year == "")
			$year = $defaultyear;
		
			
		prof_flag("getVenue(key)");
		$venue = getVenue($key);
		if ($venue == null){
			$venue = (object)[];
			$venue->name = $years[$defaultyear][0]->paper->venue." - ".$key;
			$venue->id = $key;
		}
			
			
		prof_flag("ksort");
		ksort($years);
		//$year = $years->paper->year;
		if (array_key_exists($year, $years)){
            $vignettes = $years[$year];
		}else{
		    $vignettes = [];
		}
		//print_r($years[$defaultyear][0]->a);die();
		
		prof_flag("render");
		//$title = "Summaries from ".$venue->name;
		include("templates/venue.php");
	}
	prof_flag("Done");
	prof_print();
	die();
});
$app->get('/users', function (Request $request, Response $response) {
	$users = getUsers();
	$title = "All users";
	$description = "Browse users with summaries";
	include("templates/allusers.php");
	die();
});
$app->post('/user', function (Request $request, Response $response) {
	
	$useredit = (object)[];
	$useredit->username = $request->getParam('username');
	$useredit->displayname = $request->getParam('displayname');
	$useredit->description = $request->getParam('description');
	$useredit->password = $request->getParam('password');
	$useredit->orcid = $request->getParam('orcid');
	$useredit->email_receive_comments = $request->getParam('email_receive_comments') == "true";
	
	
	if ($useredit->username != getcurrentuser()->username){
		die("Hello");
	}
	
	$user = getuser($useredit->username);
	
	editUser($user, $useredit);
	
	echo "{}";
	die();
});
$app->get('/export', function (Request $request, Response $response) {
	//$name = $request->getParam('name');
	$currentuser = getcurrentuser();
	if ($currentuser->userid == -1){
		header("HTTP/1.1 303 See Other");
		header("Location: ./login");
		//header("Refresh: 0; url=$DEFAULTBASEURL/login");
		die();
	}
	$vignettes = getUsersVignettes($currentuser->userid);
	include("templates/vignettecsv.php");
	die();
});
$app->get('/install', function (Request $request, Response $response) {
	//createDB();
});
$app->get('/login', function (Request $request, Response $response) {
	
	$currentuser = getcurrentuser();
	
	include("templates/login.php");
	die();
});
$app->get('/logout', function (Request $request, Response $response) {
	
	logoutcookie();
	header("HTTP/1.1 303 See Other");
	header("Location: ./");
	//header("Refresh: 0; url=./");
	die();
});
$app->post('/login', function (Request $request, Response $response) {
	$login = (object)[];
	$login->loginname = $request->getParam('loginname');
	$login->password = $request->getParam('password');
	
	$returnto = $request->getParam('returnto');
	
	$loginresult = takelogin($login);
	
	//print_r($loginresult);die();
	if ($loginresult->message == "No user"){
		header("HTTP/1.1 303 See Other");
		header("Location: ./signup");
	}else if ($loginresult->message != ""){
		include("templates/login.php");
	}else if ($returnto != ""){
		
		header("HTTP/1.1 303 See Other");
		header("Location: ./".$returnto);
		//header("Refresh: 0; url=".$returnto);
		die();
	}else{
		header("HTTP/1.1 303 See Other");
		header("Location: ./user");
		//header("Refresh: 0; url=./user");
		die();
	}
	die();
});
$app->get('/signup', function (Request $request, Response $response) {
	include("templates/signup.php");
	die();
});
$app->get('/recover', function (Request $request, Response $response) {
	include("templates/recover.php");
	die();
});
$app->get('/confirmrecover', function (Request $request, Response $response) {
	$confirm = (object)[];
	$confirm->email = $request->getParam('email');
	$confirm->psecret = $request->getParam('psecret');
	
	$result = validaterecoveremail($confirm->email, $confirm->psecret);
	
	if ($result){
		header("HTTP/1.1 303 See Other");
		header("Location: ./user");
		//header("Refresh: 0; url=./user");
	}else{
		$message = "Your reset link may have expired!";
		include("templates/error.php");
	}
	die();
});
$app->post('/recover', function (Request $request, Response $response) {
	$recover = (object)[];
	$recover->email = $request->getParam('email');
	
	$recoverresult = recoverUser($recover);
	
	include("templates/recover.php");
	die();
});
$app->post('/signup', function (Request $request, Response $response) {
	$signup = (object)[];
	$signup->username = $request->getParam('username');
	$signup->email = $request->getParam('email');
	$signup->displayname = $request->getParam('displayname');
	$signup->password = $request->getParam('password');
	
	$signupresult = addUser($signup);
	
	include("templates/signup.php");
	die();
});
$app->get('/confirm', function (Request $request, Response $response) {
	
	$confirm = (object)[];
	$confirm->username = $request->getParam('username');
	$confirm->psecret = $request->getParam('psecret');
	
	$result = validatesignupemail($confirm->username, $confirm->psecret);
	
	if ($result){
		header("HTTP/1.1 303 See Other");
		header("Location: ./user");
		//header("Refresh: 0; url=./user");
	}else{
		$message = "Please contact us!";
		include("templates/error.php");
	}
	die();
});
$app->get('/sitemap.xml', function (Request $request, Response $response) {
	$vignettes = getVignettePapers();
	$venues = getVenues();
	
	header('Content-Type: text/xml');
	include("templates/sitemapxml.php");
	die();
});
$app->get('/rss-generate', function (Request $request, Response $response) {
	
	ob_start();
	$vignettes = getRecentVignettes(100, 1, "");
	header('Content-Type: text/xml');
	include("templates/rss.php");
	$contents = ob_get_flush();
	$contents = stripInvalidXml($contents);
	$xml = new SimpleXMLElement($contents);
	file_put_contents("rss.xml",$xml->asXML());
	
	ob_start();
	$vignettes = getRecentVignettes(1000000, 1, "");
	header('Content-Type: text/xml');
	include("templates/rss.php");
	$contents = ob_get_flush();
	$contents = stripInvalidXml($contents);
	$xml = new SimpleXMLElement($contents);
	file_put_contents("rss-all.xml",$xml->asXML());
	
	ob_start();
	$vignettes = getRecentVignettes(1000000, 1, "");
	$full = True;
	header('Content-Type: text/xml');
	include("templates/rss.php");
	$contents = ob_get_flush();
	$contents = stripInvalidXml($contents);
	$xml = new SimpleXMLElement($contents);
	file_put_contents("rss-full.xml",$xml->asXML());
	
	die();
});
	
$app->get('/about', function (Request $request, Response $response) {
	include("templates/about.php");
	die();
});
/// QA stuff
$app->post('/newquestion', function (Request $request, Response $response) {
	$question = (object)[];
	$question->paperid = $request->getParam('paperid');
	$question->text = $request->getParam('text');
	$question->category = $request->getParam('category');
	addQuestion($question);
	echo "{}";
	die();
});
$app->post('/newanswer', function (Request $request, Response $response) {
	$answer = (object)[];
	$answer->questionid = $request->getParam('questionid');
	$answer->text = $request->getParam('text');
	addAnswer($answer);
	echo "{}";
	die();
});
// $app->post('/editquestion', function (Request $request, Response $response) {
// 	$question = (object)[];
// 	$question->questionid = $request->getParam('questionid');
// 	$question->status = $request->getParam('status');
// 	$question->category = $request->getParam('category');
// 	editQuestion($question);
// 	echo "{}";
// 	die();
// });
$app->get('/questions', function (Request $request, Response $response) {
	$paperid = $request->getParam('paperid');
	
	$questions = getQuestions($paperid);
	
	for ($i = 0; $i < sizeof($questions); $i++) {
		$questions[$i]->answers = getAnswers($questions[$i]->id);
	}
	
	
	echo json_encode($questions);
	die();
});
$app->get('/visits', function (Request $request, Response $response) {
		
	$bibtexKey = $request->getParam('bibtexKey');
	$report = $request->getParam('report');
	$userid = $request->getParam('userid');
	
	$previousdays = 7;
	if ($report == "1m"){
		$previousdays = 30;
	}
	
	if ($bibtexKey){
		$views = getVisitCounts($bibtexKey, $previousdays);
	}
	
	if ($userid){
		$views = getVisitCountsUser($userid, $previousdays);
	}
	
	//print_r($views);
	
	include("templates/visits.php");
	die();
});
$app->run();