#!/usr/bin/perl -w

use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Digest::MD5 qw(md5_hex);
use Template;
use lib "./lib";
use RiveScript;
use Time::Format qw(time_format);

# How long after inactivity to expire sessions.
my $expire = 60*60*4; # 4 hours

my $q = new CGI();

# See if a template was given via query string.
my $document = $q->param("template") || '';
if (length $document) {
	# Filter that!
	$document =~ s/[^A-Za-z0-9\.\-]//ig;
	if ($document !~ /\.rs$/i) {
		$document .= ".rs";
	}

	# Does it exist?
	if (!-f "./templates/$document") {
		$document = '';
	}
}

# Get the list of templates.
my $docs = {};
opendir (DIR, "./templates");
foreach my $file (sort(grep(/\.rs$/i, readdir(DIR)))) {
	open (READ, "./templates/$file");
	my @contents = <READ>;
	close (READ);
	chomp @contents;

	# Save a cleartext copy, and a JavaScript-friendly copy.
	my $body = join("\n",@contents);
	my $js = $body;
	$js =~ s/([\\"])/\\$1/ig;
	$js =~ s/\n/\\n/ig;
	$js =~ s/[\x0d\x0a]//ig;

	# Save these for the JavaScript selector.
	$docs->{$file}->{body} = $body;
	$docs->{$file}->{js}   = "templates[\"$file\"] = \"$js\";";
}
closedir (DIR);

# Make up a random unique session ID for this user.
my $session = md5_hex (time() . $ENV{REMOTE_ADDR} . $$);
while (-d "./sessions/$session") {
	$session = md5_hex (int(rand(999_999_999)));
}
mkdir ("./sessions/$session") or die "Can't make session directory: $!";
open (EXP, ">./sessions/$session/active.dat") or die "Can't write active.dat: $!";
print EXP time();
close (EXP);

# Expire old sessions.
opendir (DIR, "./sessions");
foreach my $ses (sort(grep(!/^\./, readdir(DIR)))) {
	next unless -f "./sessions/$ses/active.dat";
	my ($mtime) = (stat("./sessions/$ses/active.dat"))[9];

	# See if it's expired.
	if (time() - $mtime > $expire) {
		# Delete this session.
		opendir (SES, "./sessions/$ses");
		foreach my $file (sort(grep(!/^\./, readdir(SES)))) {
			unlink ("./sessions/$ses/$file");
		}
		closedir (SES);
		rmdir("./sessions/$ses");
	}
}

# Give them the template page.
my $template = new Template ({
	INCLUDE_PATH => "./tt",
	RELATIVE     => 1,
});
my $vars = {
	session   => $session,
	version   => $RiveScript::VERSION,
	document  => $document,
	templates => $docs,
	year      => time_format('yyyy'),
};
#die Dumper($vars);
use Data::Dumper;

print "Content-Type: text/html\n\n";
$template->process ("front.tt", $vars, undef) || $template->error();
