#!/usr/bin/perl

$data = 'White (1) 7738
Light Bluish Gray (86) 3000
Tan (2) 2713
Black (11) 2614
Reddish Brown (88) 2025
Magenta (71) 1656
Medium Azure (156) 1557
Bright Pink (104) 1449
Red (5) 1409
Lime (34) 1303
Yellow (3) 1165
Medium Lavender (157) 1150
Bright Light Orange (110) 1141
Green (6) 1136
Dark Pink (47) 940
Trans-Clear (12) 911
Dark Purple (89) 774
Dark Bluish Gray (85) 737
Pearl Gold (115) 609
Trans-Light Blue (15) 602
Bright Green (36) 524
Medium Dark Flesh (150) 437
Trans-Yellow (19) 431
Lavender (154) 366
Light Flesh (90) 363
Trans-Dark Pink (50) 338
Dark Blue (63) 324
Medium Blue (42) 317
Dark Red (59) 258
Dark Orange (68) 231
Trans-Red (17) 221
Orange (4) 217
Bright Light Yellow (103) 213
Flat Silver (95) 212
Trans-Neon Green (16) 202
Light Aqua (152) 189
Blue (7) 183
Trans-Dark Blue (14) 145
Trans-Orange (98) 134
Dark Tan (69) 112
Dark Brown (120) 84
Bright Light Blue (105) 84
Trans-Green (20) 69
Trans-Black (13) 61
Trans-Purple (51) 55
Trans-Neon Orange (18) 47
Trans-Medium Blue (74) 37
Metallic Silver (67) 36
Dark Azure (153) 33
Trans-Bright Green (108) 22
Yellowish Green (158) 16
Dark Green (80) 16
Sand Blue (55) 13
Sand Green (48) 9
Chrome Gold (21) 3
Pearl Dark Gray (77) 2
Glitter Trans-Dark Pink (100) 2
Glitter Trans-Neon Green (163) 1
Glitter Trans-Purple (102) 1';

%colors = (
    1 => [ 244 ,244 , 244], #white
    86 => [ 160,160 ,158 ], #light gray
    2 => [ 220 ,196 ,141 ], #tan
    11 => [ 0, 0, 0], #black
    88 => [ 105, 45, 19], #redbrown
    71 => [ 180, 27, 125], # magenta
    156 => [ 0, 189, 211], #med. azure
    104 => [ 246, 173, 205], #bt pink
    5 => [221,26,33], #red
    34 => [153,202,60], #lime
    3 => [255,205,2], #yellow
    157 => [150,116,180], #md lavender
    110 => [250,171,24], #bt lt orange
    6 => [0,146,71], #green
    47 => [223,92,161], #dk pink
    12 => [236,236,235], #trans-clear
    89 => [75,46,145], #dark pruple
    85 => [100,103,100], #dk bluish gray
    115 => [194,150,54], #pearl gold
    15 => [91,193,189], #trans-light blue
    36 => [0,174,76], #bright green
    150 => [174,115,70], #medium dk flesh
    19 => [255,221,0], #trans-yellow
    154 => [187,166,207], #lavender
    90 => [251,195,158], #light flesh
    50 => [234,84,158], #trans-dark pink
    63 => [0,57,93], #dark blue
    42 => [72,158,206], #medium blue
    59 => [127,19,27], #dark red
    68 => [165,82,33], #dark orange
    17 => [232,30,38], #trans-red
    4 => [244,124,32], #orange
    103 => [255,245,121], #bright light yellow
    95 => [135,141,142], #flat silver
    16 => [235,231,34], #trans-neon green
    152 => [192,227,218], #light aqua
    7 => [0,108,183], #blue
    14 => [0,152,210], #trans-dark blue
    98 => [244,136,48], #trans-orange
    69 => [147,126,94], #dark tan
    120 => [58,23,12], #dark brown
    105 => [120,190,233], #bright light blue?
    20 => [0,167,78], #trans-green
    13 => [160,145,116], #trans-black
    51 => [116,113,180], #trans-purple
    18 => [242,86,42], #trans neon orange
    74 => [136,201,228], #trans-medium blue
    67 => [135,141,142], #metallic silver
    153 => [0,162,218], #dark azure
    108 => [150,199,81], #trans bt green
    158 => [204,225,151], #yellowish green?
    80 => [0,73,45], #dark green
    55 => [103,130,151], #sand blue
    48 => [110,148,122], #sand green
#    21 => [,,], #chrome gold
#    77 => [,,], #pearl dk gray
#    100 => [,,], #trans-glitter dark pink
#    163 => [,,], #trans-glitter neon green
#    102 => [,,], #trans-glitter purple
    );

foreach my $line (split /\n/,$data) {
    if($line =~ /^(\S+.*) \((\d+)\) (\d+)\s*$/) {
	my($name,$cid,$qty) = ($1,$2,$3);
	$total+=$qty;
	$data{$name} = $qty;
	$ids{$name} = $cid;
    } else {
	print "ACK: $line\n";
    }
}

$t_width = 500;
$t_height = 500;
$total_area = $t_width * $t_height;

$height = 0;
$width = 0;
foreach my $name (sort {$data{$b} <=> $data{$a} } (keys %data)) {
    my($x,$y) = find_rectangle($total_area * ($data{$name} / $total));
    $height += $y + 3;
    if($width < ($x+100)) { 
	$width = $x+100;
    }
    print "$x,$y - $name\n";
}

use GD;
$img = new GD::Image($width,$height,1);
$img->fill(10,5,color(255,255,255));
my($x) = 0;
my($y) = 0;
foreach my $name (sort {$data{$b} <=> $data{$a} } (keys %data)) {
    my($sx,$sy) = find_rectangle($total_area * ($data{$name} / $total));
    $img->filledRectangle(0,$y,$sx,$y+$sy,color(@{$colors{$ids{$name}}}));
    $img->string(gdTinyFont,$sx+5,$y,$name,color(0,0,0));
    $y += $sy + 3;
}
open($FH,">","squarechart.png");
print $FH $img->png;
close $FH;

sub find_rectangle {
    my($target) = @_;
    my($mid) = int(sqrt($target));
    if($mid * $mid == $target) {
	return ($mid,$mid);
    }
    my($best) = $mid*$mid;
    my($x,$y);
    @list = ([$mid,$mid]);
    for($x=$mid;$x<$mid+10;$x++) {
	for($y=$mid+1;$y>$mid-10;$y--) {
	    if(abs($x * $y - $target) < abs($best - $target)) {
		@list = ([$x,$y]);
		$best = $x*$y;
	    } elsif(abs($x * $y - $target) == abs($best - $target)) {
		push @list,[$x,$y];
	    }
	}
    }
    my $dist = abs($list[0][0] - $list[0][1]);
    my($rx,$ry) = ($list[0][0],$list[0][1]);
    foreach my $pair (@list) {
	if(abs($pair->[0] - $pair->[1]) < $dist) {
	    $dist = abs($pair->[0] - $pair->[1]);
	    ($rx,$ry) = ($pair->[0],$pair->[1]);
	}
    }
    return($rx,$ry);
}

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