#!/usr/bin/perl

use DB_File;
use CGI;

my $COINLIFETIME = 30;

my %coins_db;
my $cgi = CGI->new();
my $requestedcoinid = $cgi->param('coinid');
my $requestedaction = $cgi->param('action');
my $coinsindb=0;
my $flippedcoinsindb=0;

sub alert {
    print "<b>ERROR:</b> @_[0]\n";
}

sub printcoin {
    print "<a href=/@_[0]>";
    print "<font style=\"BACKGROUND-COLOR: yellow\" color=blue><b>";
    print "http://$ENV{HTTP_HOST}/@_[0]";
    print "</b></font>";
    print "</a>";
}

sub printresult {
    if ( @_[0] == 0 ) {
	print "Heads";
    }
    else {
	print "Tails";
    }
}

if (-e "var/coins.db") {
    tie (%coins_db, DB_File, "var/coins.db") ||
        die ("Cannot open var/coins.db");
}
else {
    tie (%coins_db, DB_File, "var/coins.db", O_CREAT|O_RDWR, 0640) ||
        die ("Cannot create or open var/coins.db");
}

foreach my $key ( keys %coins_db )
{
    @value = split(/,/, $coins_db{$key});
    if ( time-$value[0] > $COINLIFETIME*(60*60*24) ) {
	delete $coins_db{$key};
    }

    $coinsindb++;
    if ( ($#value + 1) == 3 ) {
	$flippedcoinsindb++;
    }
}

print "Content-type: text/html\n\n";
print "<html>";
print "<head>";
print "<title>flipacoin.org - The Internet's first coinflipping service.</title>";
print "</head>";
print "<body>";

if ( ! ($requestedcoinid =~ /\A[a-z0-9]*\z/) ) {
    alert("You sent me an invalid coin!");
    exit;
}

if ( ! ($requestedaction =~ /\A[a-z]*\z/) ) {
    alert("You sent me an invalid action!");
    exit;
}

print "<font size=1>During the last $COINLIFETIME days $flippedcoinsindb/$coinsindb coins were flipped/created. | <a href='http://git.treefish.org/wirbrennen/flipacoin.git' target='_blank'>git</a></font>";
print "<hr>";
print "<h3>flipacoin.org - The Internet's first coinflipping service.</h3>";

if ( length($requestedcoinid) == 0 && $requestedaction eq "" ) {
    print "<a href=/?action=create><font color=blue>[Create a coin]</font></a>";
    print " to make a decision.";
}
elsif ( length($requestedcoinid) == 0 && $requestedaction eq "create" ) {
    my @chars = ("a".."z", "0".."9");
    my $newcoinid;
    $newcoinid .= $chars[rand @chars] for 1..13;
    while ( exists $coins_db{$newcoinid} ) {
	$newcoinid = "";
	$newcoinid .= $chars[rand @chars] for 1..13;
    }

    $coins_db{$newcoinid} = time;

    print "Created a new coin ";
    printcoin($newcoinid);
    print " for you.<br>";
    print "<br>";
    print "Send the coin to the other party and tell them to flip it to make a decision.";
}
elsif ( length($requestedcoinid) > 0 ) {
    if ( ! exists $coins_db{$requestedcoinid} ) {
	alert("The coinid $requestedcoinid does not exist!");
	exit;
    }

    my @coininfo = split(/,/, $coins_db{$requestedcoinid});
    my $coininfosize = $#coininfo + 1;

    printcoin($requestedcoinid);
    print "<br>";
    print "<pre>";
    print "<b>Creation time:</b> " . localtime($coininfo[0]);
    print "<br>";

    if ( $coininfosize == 1 && $requestedaction eq "" ) {
	print "<b>Status:</b> Not yet flipped ";
	print "<a href=/$requestedcoinid?action=flip>";
	print "<font color=blue>[flip it]</font>";
	print "</a>";
    }
    elsif ( $coininfosize == 1 && $requestedaction eq "flip" ) {
	$result = int(rand(2));
	$coins_db{$requestedcoinid} = $coins_db{$requestedcoinid} .
	    "," . time .
	    "," . $result;
	print "<b>Status:</b> Just flipped";
	print "<br>";
	print "<b>Result:</b> ";
	printresult($result);
    }
    elsif ( $coininfosize == 3 ) {
	print "<b>Status:</b> Flipped @ " . localtime($coininfo[1]);
	print "<br>";
	print "<b>Result:</b> ";
	printresult($coininfo[2]);
    }

    print "</pre>";
}

print "</body>";
print "</html>";

untie(%coins_db);

exit;