#!/usr/bin/perl
use lib "/home/dave/perl/maze_def";
use MD;
use GD;
use Data::Dumper;
require "/home/dave/public_html/cgi-lib.pl";
ReadParse(*params);

$ranks = MD::get_ranks();
$monsters = MD::get_monster_stats();
$file = "/home/dave/perl/maze_def/live_stats";
if(!open(FH,$file)) {
    print "Content-Type: text/html\n\n";
    print "Error opening file!\n";
    exit(1);
}
#diff    money   level   color   rank                    id,hp,spd,qty           ....
#3       1460    301     0       Kingdom guardian        102,113000,1.26,105     139,41400,2.46,93       97,117000,1.18,58       112,68000,1.61,31

if($params{irank}) {
    $params{rank} = $params{irank};
}

#print Dumper($monsters);
#exit(0);
#print "Content-Type: text/html\n\n";

while(<FH>) {
    chomp;
    my($diff,$money,$power,$color,$rank,@groups) = split /\t/;
    if($params{combine}) {
	$diff = 6;
    }

    #$rank =~ s/peon/PN/i;
    $rank =~ s/peon/SP/i; #guh.
    $rank =~ s/lord/LD/i;
    $rank =~ s/knight/KN/i;
    $rank =~ s/kingdom guardian/KG/i;
    $rank =~ s/high templar/HT/i;
    $rank =~ s/judicator/JD/i;
    $rank =~ s/great king/GK/i;

    if($params{irank}) {
	$key = $params{irank}.".$power.$diff";
    } else {
	$key = "$rank.$power.$diff";
    }
    #print "Saving data for $key<br>\n";
    my($mom) = 0;
    my($totalq) = 0;
    foreach my $group (@groups) {
	my($id,$hp,$sp,$qt) = split /,/,$group;
	
	if($params{irank}) {
	    $hp = $monsters->{$id}{$params{irank}}{hp};
	    $sp = $monsters->{$id}{$params{irank}}{spd};
	    if(!$hp || !$sp) {
		print "Content-Type: text/html\n\n";
		print "Bad data for $id at $params{irank} ($hp,$sp)\n";
		print Dumper($monsters->{$id});
		exit(0);
	    }
	}

	$totalq += $qt;
	if($params{type} =~ /^(avgqty|qty|quantity)$/i) {
	    $mom += $qt;
	} elsif($params{type} =~ /^(avg)?(hp|hitpoints)$/i) {
	    $mom += $hp*$qt;
	} elsif($params{type} =~ /^(spd|speed)$/) {
	    $mom += $sp*$qt;
	} else {
	    $mom += $hp*$sp*$qt;
	}
    }
    if($params{type} =~ /^(avghp|avghitpoints|spd|speed|avgmom)$/ && $totalq) {
	$mom /= $totalq;
    }
    if($params{type} =~ /money/i) {
	$mom = $money;
    }
    push @{$data{$key}{data}},$mom;
    $data{$key}{total} += $mom;
    $data{$key}{min} = $mom if($mom < $data{$key}{min} || !$data{$key}{min});
    $data{$key}{max} = $mom if($mom > $data{$key}{max});
}
$rank = $params{rank} || "HT";
$diff = (defined($params{diff})) ? $params{diff} : 1;
$diff = ($params{combine}) ? 6 : $diff;

$min_mom = 0;
#if($params{type} eq "qty") {
#    $max_mom = "1100";
#} else {
#    $max_mom = 308000000;
#}
$max_mom = 1;

foreach my $key (keys %data) {
    my($rnk,$pwr,$dff) = split /\./,$key;
    next unless($rank eq $rnk);
    next unless($diff eq $dff);
    next unless($pwr);
    $data{$key}{mean} = $data{$key}{total} / (scalar @{$data{$key}{data}});
    my $stdev = 0;
    #print "$stdev -> ";
    foreach my $pt (@{$data{$key}{data}}) {
	$stdev += ($pt - $data{$key}{mean})**2;
	#print "$stdev -> ";
    }
    $stdev /= scalar(@{$data{$key}{data}});
    #print "$stdev -> ";
    $stdev = sqrt($stdev);
    #print "$stdev -> ";
    $data{$key}{stdev} = $stdev;
    $max_mom = $data{$key}{max} if($data{$key}{max} > $max_mom);
    $min_power = $pwr if($pwr < $min_power || !$min_power);
    $max_power = $pwr if($pwr > $max_power);

    #print "$key,$data{$key}{min},$data{$key}{mean},$data{$key}{max},$stdev<br>\n";
}
#print "Min power: $min_power\n";
#print "Max power: $max_power\n";
#exit(0);
$hscale = 8;
$high_power = 500;

$maxy = 600;
$maxx = $hscale*$high_power;
$img = new GD::Image($hscale*$high_power,$maxy,1);
#$img->fill(10,10,color(223,223,223));
$img->fill(10,10,color(255,255,255));

if($diff == 5) {
    $line_color = color(255,0,0);
} elsif($diff == 4) {
    $line_color = color(255,127,0);
} elsif($diff == 3) {
    $line_color = color(127,223,0);
} elsif($diff == 2) {
    $line_color = color(0,175,0);
} elsif($diff == 1) {
    $line_color = color(0,127,255);
} elsif($diff == 0) {
    $line_color = color(127,0,191);
} elsif($diff == 6) {
    $line_color = color(255,0,0);
}

my($lastx,$lasty) = (-1,-1);
my($lasthighy,$lastlowy) = (-1,-1,-1,-1);
draw_grid(0,$max_mom,$hscale);
for($power=$min_power;$power<=$max_power;$power++) {
    $key = "$rank.$power.$diff";
    if(!exists($data{$key})) {
	$lastx = -1;
	$lasty = -1;
	$lasthighy = -1;
	$lastlowy = -1;
    } else {
	my($x) = $power*$hscale;
	my($y) = $maxy-(int($data{$key}{mean}*$maxy/$max_mom));
	my($highy) = $maxy-(int(($data{$key}{mean}+$data{$key}{stdev})*$maxy/$max_mom));
	my($lowy) = $maxy-(int(($data{$key}{mean}-$data{$key}{stdev})*$maxy/$max_mom));
	$img->stringUp(gdTinyFont,$x-4,$maxy-2,"$power",color(0,0,0));
	$img->filledRectangle($x-($hscale/2),$highy,$x+($hscale/2),$lowy,color(223,223,223));
	if($params{text}) {
	    print "$key\t$power\t$data{$key}{mean}\n";
	}
	if($lastx >= 0) {
	    $img->line($lastx,$lasty+1,$x,$y+1,$line_color);
	    $img->line($lastx,$lasty,$x,$y,$line_color);
	    $img->line($lastx,$lasty-1,$x,$y-1,$line_color);
	    #$img->line($lastx,$lasthighy,$x,$highy,color(255,191,191));
	    #$img->line($lastx,$lastlowy,$x,$lowy,color(255,191,191));
	}
	$lastx = $x;
	$lasty = $y;
	$lasthighy = $highy;
	$lastlowy = $lowy;
	foreach my $pt (@{$data{$key}{data}}) {
	    draw_dot($x,$maxy-int($pt*$maxy/$max_mom));
	    #$img->string(gdTinyFont,$x+5,($maxy-int($pt*$maxy/$max_mom)),"".(sprintf("%d",$pt/1000000))."",color(255,0,0));
	    #$img->setPixel($x,$maxy-int($pt*$maxy/$max_mom),color(0,0,255));
	}
    }
}

if($params{proj}) {
    #projected graph
    my($power,$lastmom,$lastx,$lasty);
    $lastx = -1;
    $lasty = -1;
    for($power=1;$power<$high_power;$power++) {
	my($mom) = MD::get_projected_momentum($power,$ranks->{$rank}{id});
	my($x) = $power * $hscale;
	my($y) = $maxy - (int($mom*$maxy/$max_mom));
	if($lasty >= 0) {
	    $img->line($lastx,$lasty,$x,$y,color(0,191,0));
	}
	$lastx = $x;
	$lasty = $y;
    }
}

#$img->line($x*$hscale,0,$x*$hscale,$vscale*26,color(191,191,191));
#$img->string(gdTinyFont,$x*$hscale+25,$vscale*26+5,"$mon $d",color($c,$c,$c));

#$img->filledRectangle($total_times*$hscale,$data{$id}{final}*$vscale-3,$total_times*$hscale+7,$data{$id}{final}*$vscale+4,fade_color($c[0],$c[1],$c[2]));

#$img->stringUp(gdTinyFont,($x-1)*$hscale,26*$vscale+10+($len*5),"$str",fade_color($c[0],$c[1],$c[2]));

unless($params{text}) {
    print "Content-Type: image/png\n\n";
    binmode STDOUT;
    print $img->png;
}

sub draw_dot {
    my($x,$y) = @_;
    $img->setPixel($x,$y,color(0,0,255));
    $img->setPixel($x+1,$y,color(0,0,255));
    $img->setPixel($x-1,$y,color(0,0,255));
    $img->setPixel($x,$y+1,color(0,0,255));
    $img->setPixel($x,$y-1,color(0,0,255));

#    $img->setPixel($x+1,$y+1,color(127,127,255));
#    $img->setPixel($x+1,$y-1,color(127,127,255));
#    $img->setPixel($x-1,$y+1,color(127,127,255));
#    $img->setPixel($x-1,$y-1,color(127,127,255));
}

sub draw_grid {
    my($minval,$maxval,$hscale) = @_;
    my($y,$v);
    for($x=0;$x<=$maxx;$x+=$hscale) {
	$img->line($x,$miny,$x,$maxy,color(207,207,207));
    }
    my($step) = ($maxval-$minval)/($maxy/$hscale);
    for($y=0,$v=$maxval;$y<=$maxy;$y+=$hscale) {
	$img->line(0,$y,$maxx,$y,color(207,207,207));
	if($params{type} =~ /^(avgqty|qty|quantity|speed|spd?|avghp|avghitpoints|money|avgmom)$/i) {
	    $img->string(gdTinyFont,0,$y-4,sprintf("%.1f",$v),color(127,127,127));
	} else {
	    $img->string(gdTinyFont,0,$y-4,sprintf("%.1f"."M",($v/1000000)),color(127,127,127));
	}
	$v-=$step;
    }
}

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;
}

sub fade_color {
    my($r,$g,$b) = @_;
    if(!defined($fpal{"$r\_$g\_$b"})) {
	my($avg) = ($r+$g+$b)/3;
	$fpal{"$r\_$g\_$b"} = color($r+($avg-$r)/2,$g+($avg-$g)/2,$b+($avg-$b)/2);
    }
    return $fpal{"$r\_$g\_$b"};
}

sub color {
    my($r,$g,$b) = @_;
    if(!defined($pal{"$r\_$g\_$b"})) {
        $pal{"$r\_$g\_$b"} = $img->colorAllocate($r,$g,$b);
    }
    return $pal{"$r\_$g\_$b"};
}
