#!/usr/bin/perl

require "../cgi-lib.pl";
#require "../pagelib.pl";
ReadParse(*params);

print "Content-Type: text/html\n\n";

if(!$params{password}) {
    print "Sorry, this page is generating too much bandwidth!<br>\n";
    exit(1);
}

my($dir) = '/home/dave/lego/top_sellers';
opendir(D,$dir);
my(@files) = readdir(D);
foreach my $f (@files) {
    next unless($f =~ /^top\.(\d+)$/);
    my($time) = $1;
    if(!$min || $time < $min) { $min = $time; }
    if($time > $max) { $max = $time; }
    my($timestamp) = tstamp($time);
    $valid_times{$timestamp}++;
    open(F,"$dir/$f");
    while(<F>) {
	chomp;
	my($pos,$id,$name) = split /\t/;
	$data{$id}{place}{$timestamp} = $pos;
	$data{$id}{name} = $name;
    }
    close F;
}
$t = $min;
$timestamp = tstamp($t);
$maxt = tstamp($max);
while($timestamp<=$maxt) {
    foreach my $id (keys %data) {
	if(!$data{$id}{place}{$timestamp}) {
	    if($valid_times{$timestamp}) {
		$data{$id}{place}{$timestamp} = -1;
	    } else {
		$data{$id}{place}{$timestamp} = $last_place{$id};
	    }
	}
	$data{$id}{total} += ($data{$id}{place}{$timestamp} > 0) ? $data{$id}{place}{$timestamp} : 26;
	$last_place{$id} = $data{$id}{place}{$timestamp};
    }
    $t += (60*60);
    $timestamp = tstamp($t);
}
for(-1..26) {
    $minplace{$_} = 26;
}

#print "<table border=\"1\">\n";
print "<table cellspacing=0 cellpadding=1>\n";
#print "<tr style=\"display: none; visibility: hidden;\"><td></td>\n";
print "<tr><td></td><td></td>\n";
foreach my $ts (sort {$a<=>$b} (keys %{$data{'10182'}{place}})) {
    print "<td><font size=-2>";
    my($y,$m,$d,$h) = unpack('A4A2A2A2',$ts);
    print "$m/$d<br>$h\:00";
    print "</font></td>\n";
}
print "</tr>\n";

foreach my $id (sort {
    #return $data{$a}{total} <=> $data{$b}{total};
    if($data{$a}{place}{$maxt} < 0) {
	if($data{$b}{place}{$maxt} < 0) {
	    return $data{$a}{total} <=> $data{$b}{total};
	}
	return 1;
    }
    if($data{$b}{place}{$maxt} < 0) { return -1; }
    return $data{$a}{place}{$maxt}<=>$data{$b}{place}{$maxt}
} (keys %data)) {
    my($avg_place) = $data{$id}{total}/scalar(keys %{$data{$id}{place}});
    $is_starwars = ($id =~ /^(765[456789]|620[5689]|621[012]|10030|101(34|4[34]|7[459])|3913|85146[24]|85193[89]|852085|GBA960|GC958|KC091|M229|NDS961|PC918|PS2935|PSP939|TS4[123456]|XB376|XB975)$/) ? "sw" : "nsw";
    print "<tr>\n";
    print "<td align=right nowrap><font size=-1";
    if($is_starwars eq "sw") {
	print " color=#FF0000";
    }
    print ">$id - $data{$id}{name}</font></td>\n";
    print "<td><font size=-1>".sprintf("%0.2f",($avg_place))."</font></td>\n";
    my($last) = undef;
    foreach my $ts (sort {$a<=>$b} (keys %{$data{$id}{place}})) {
	print "<td bgcolor=#";
	my($diff) = 0;
	if(defined($last) && $data{$id}{place}{$ts} != $last) {
	    if($data{$id}{place}{$ts} < 0) {
		$diff = abs(26-$last);
	    } elsif($last < 0) {
		$diff = abs(26-$data{$id}{place}{$ts});
	    } else {
		$diff = abs($data{$id}{place}{$ts} - $last);
	    }
	}
	$time_diffs{$ts}+=$diff;
	if($data{$id}{place}{$ts} < 0) {
	    print "C0C0C0";
	} else {
	    $swdata{$is_starwars}++;
	    $swdata{$ts}{$data{$id}{place}{$ts}} = $is_starwars;
	    foreach('r','g','b') {
		print sprintf("%02x",get_rgb_value(0,13,25,$data{$id}{place}{$ts},$_));
	    }
	}
	print "><font size=-1";
	if($maxplace{$data{$id}{place}{$ts}} < $avg_place) { $maxplace{$data{$id}{place}{$ts}} = $avg_place; }
	if($minplace{$data{$id}{place}{$ts}} > $avg_place) { $minplace{$data{$id}{place}{$ts}} = $avg_place; }
	print ">$data{$id}{place}{$ts}</td>";
	$last = $data{$id}{place}{$ts};
    }
    print "<td><font size=-1>".sprintf("%0.2f",($avg_place))."</font></td>\n";
    print "</tr>\n";
}

print "<tr><td><br></td></tr>\n";
print "<tr><td></td><td></td>\n";
foreach my $ts (sort {$a<=>$b} (keys %{$data{'10182'}{place}})) {
    print "<td><font size=-2>";
    print $time_diffs{$ts};
    print "</font></td>\n";
}
print "</tr>\n";
print "<tr><td></td><td></td>\n";
foreach my $ts (sort {$a<=>$b} (keys %{$data{'10182'}{place}})) {
    print "<td><font size=-2>";
    my($tally) = 0;
    for($i=1;$i<=25;$i++) {
	if($swdata{$ts}{$i} eq "sw") { $tally++; }
    }
    print (($tally > 15) ? "<font color=green>" : ($tally < 11) ? "<font color=red>" : "<font color=black>");
    print $tally . "</font>";
    print "</font></td>\n";
}
print "</tr>\n";
print "</table>\n";

print "Star Wars: $swdata{sw}<br>Non Star Wars: $swdata{nsw}<br>\n";

for(-1..26) { print "$_ - max: $maxplace{$_} - min: $minplace{$_}<br>\n"; }

sub tstamp {
    my($time) = @_;
    my(@lt) = localtime($time);
    $lt[5]+=1900;
    $lt[4]++;
    return sprintf("%04d%02d%02d%02d",$lt[5],$lt[4],$lt[3],$lt[2]); #Don't care about minutes/seconds
}

sub get_rgb_value {
    my($min,$mid,$max,$val,$color) = @_;
    
    my($lowr,$midr,$highr) = (255,127,0); #Grey
    if($color eq "r") {    $lowr =  51; $midr = 230; $highr = 204; } #Red
    elsif($color eq "g") { $lowr = 153; $midr = 197; $highr =  51; } #Green
    elsif($color eq "b") { $lowr =  51; $midr =  42; $highr =  34; } #Blue

    #Calculate value
    my($color) =  ((($val-$mid)*($val-$max))/(($min-$mid)*($min-$max)))*$lowr;
    $color += ((($val-$min)*($val-$max))/(($mid-$min)*($mid-$max)))*$midr;
    $color += ((($val-$min)*($val-$mid))/(($max-$min)*($max-$mid)))*$highr;

    #Normalize
    $color = int $color;
    $color = $lowr if($val < $min);
    $color = $highr if($val > $max);
    $color = 255 if($color > 255);
    $color = 0 if ($color < 0);
    return $color;
}
