#! /usr/bin/perl -w

$script_home = "http://www.dina.kvl.dk/~abraham/prog-lang/";
$home = "$ENV{HOME}/.public_html/prog-lang/";
chdir $home;
$name_file = "names";
$fame_file = "fame.html";
$bottom_name = "Ada";

# Read old data and hits.

open (NAME, $name_file) || die "Couldn't open $name_file";

$changed = 0;

while (<NAME>)
{
    chop;
    ( $old_pos, $low_pos, $hi_pos, $name, $old_hit, $low_hit, $hi_hit, 
      $url ) = split (/\|/);
    print "$name has ";

    $search = "http://www.google.com/search?q=%22"
        . $name . " programming%22";
    $search =~ s/\+/%2B/g;
    $search =~ s/\#/%23/g;
    $search =~ s/ /+/g;
    $answer = `wget -U foo -q -O- '$search'`;

    if ($answer =~ m|of about \<b\>([0-9,]+)\</b\>|)
    {
	$new_hit = $1;
	$new_hit =~ s/,//g;
    }
    else
    {
	$new_hit = 0; 
	printf STDOUT ("<<< %s >>>", $answer);
    }

    print "$new_hit hits ";
    if ($old_hit eq "*")
    { print "(new entry)\n"; }
    else
    { printf STDOUT ("(change: %d)\n", ($new_hit - $old_hit)); }

    $changed = 1 if ($old_hit ne $new_hit);

    $hi_hit = $new_hit if ($hi_hit eq "*" || $new_hit > $hi_hit);
    $low_hit = $new_hit if ($low_hit eq "*" || $new_hit < $low_hit);

    $search{$name} = $search;
    $old_pos{$name} = $old_pos;
    $low_pos{$name} = $low_pos;
    $hi_pos{$name} = $hi_pos;
    $new_hit{$name} = $new_hit;
    $old_hit{$name} = $old_hit;
    $low_hit{$name} = $low_hit;
    $hi_hit{$name} = $hi_hit;
    $url{$name} = $url;
}

close (NAME);

exit (0) unless $changed;

# Write new data.

unlink ($name_file . ".old");
rename ($name_file, $name_file . ".old");

unlink ("old-" . $fame_file);
rename ($fame_file, "old-" . $fame_file);

open (NAME, ">$name_file") || die "Couldn't open $name_file";
open (FAME, ">$fame_file") || die "Couldn't open $fame_file";

open (HEAD, "fame.head") || die "Couldn't open fame.head";
while (<HEAD>)
{ print FAME; }
close (HEAD);

sub by_hits 
{ - ($new_hit{$a} <=> $new_hit{$b}); }

$new_pos = 1;
foreach $name (sort by_hits keys %old_pos)
{
    $new_pos{$name} = $new_pos;

    unless ($new_pos{$name} eq "*")
    { 
	$hi_pos{$name} = $new_pos 
	    if ($hi_pos{$name} eq "*" || $new_pos{$name} > $hi_pos{$name});
	$low_pos{$name} = $new_pos 
	    if ($low_pos{$name} eq "*" || $new_pos{$name} < $low_pos{$name});
	$new_pos++; 
    }

    if ($url{$name} eq "*")
    { printf FAME ("<li> %s", $name); }
    else
    { printf FAME ('<li> <a href="%s">%s</a>', $url{$name}, $name); }
    printf FAME (', <a href="%s">%d</a>',
		 $search{$name}, $new_hit{$name});

    if ($new_pos{$name} ne $old_pos{$name})
    {
	if ($old_pos{$name} eq "*")
	{
	    print FAME " (new"; 
	    if ($old_hit{$name} ne "*" && $old_hit{$name} ne $new_hit{$name})
	    { print FAME ", had $old_hit{$name} hits"; }
	}
	else 
	{
	    print FAME " (was \#$old_pos{$name}"; 
	    if ($old_hit{$name} ne "*" && $old_hit{$name} ne $new_hit{$name})
	    { print FAME " with $old_hit{$name} hits"; }
	}
	if ($hi_hit{$name} ne $old_hit{$name} 
	    && $hi_hit{$name} ne $new_hit{$name})
	{ print FAME ", max $hi_hit{$name}" }
	if ($low_hit{$name} ne $old_hit{$name} 
	    && $low_hit{$name} ne $new_hit{$name})
	{ print FAME ", min $low_hit{$name}" }
	print FAME ")";
    }
    elsif ($old_hit{$name} ne "*" && $old_hit{$name} ne $new_hit{$name})
    {
	print FAME " (had $old_hit{$name} hits";
	if ($hi_hit{$name} ne $old_hit{$name} 
	    && $hi_hit{$name} ne $new_hit{$name})
	{ print FAME ", max $hi_hit{$name}" }
	if ($low_hit{$name} ne $old_hit{$name} 
	    && $low_hit{$name} ne $new_hit{$name})
	{ print FAME ", min $low_hit{$name}" }
	print FAME ")";
    }
    elsif ($hi_hit{$name} ne $old_hit{$name} 
	   && $hi_hit{$name} ne $new_hit{$name}
	   && $low_hit{$name} ne $old_hit{$name} 
	   && $low_hit{$name} ne $new_hit{$name})
    { print FAME " (max $hi_hit{$name} hits, min $low_hit{$name} hits)" }
    elsif ($hi_hit{$name} ne $old_hit{$name} 
	   && $hi_hit{$name} ne $new_hit{$name})
    { print FAME " (max $hi_hit{$name} hits)" }
    elsif ($low_hit{$name} ne $old_hit{$name} 
	   && $low_hit{$name} ne $new_hit{$name})
    { print FAME " (min $low_hit{$name} hits)" }
    print FAME ".\n";

    print NAME "$new_pos{$name}|$low_pos{$name}|$hi_pos{$name}|$name|";
    print NAME "$new_hit{$name}|$low_hit{$name}|$hi_hit{$name}|";
    print NAME "$url{$name}\n";

    if ($name eq $bottom_name)
    { 
	$new_pos = "*"; 

	open (MIDDLE, "fame.middle") || die "Couldn't open fame.middle";
	while (<MIDDLE>)
	{ print FAME; }
	close (MIDDLE);
    }
}

open (TAIL, "fame.end") || die "Couldn't open fame.end";
while (<TAIL>)
{ 
    if ($_ =~ /Generated/)
    { printf FAME ('<a href="%s">Generated</a>: %s', $script_home, `date`); }
    else
    { print FAME; }
}
close (TAIL);

close (NAME) || die "write errors for $name_file";
close (FAME) || die "write errors for $fame_file";

