#!/usr/bin/perl -w

# This script takes in stuff and outputs a MOP alumni webpage.
# Note that it will fail around the year 2050 AD.

local $D = '';
local $SCRIPTNAME = $D.'genpage.pl'; # name of this script
local $DATAFILE = $D.'Moplist.txt'; # name of the Unicode, tab-delimited file.
local $EXCELFILE = $D.'Moplist.xls'; # name of the Excel spreadsheet
local @FILENAMES = ($D.'moplist',$D.'moplistyear');
local $MINYEAR = 1974;
local $MAXYEAR = 2001;

local @mopdata = &slurpdata;
&calcweights;
local @staff = &filter('Staff',@mopdata);
local @student = &filter('Student',@mopdata);
my $stafflist = &maketable(@staff);
my $studentlist = &maketable(@student);
local $footnotes = &makefootnotes(@mopdata);
local @sortdata = sort byweight (@mopdata);
my $alllist = &maketable(@sortdata);
my $now = `date`; chomp $now;

foreach $filename (@FILENAMES) {
  local $TEMPLATE = "$filename.template";
  local $OUTPUTFILE = "$filename.html";
  open FHAND,"<$TEMPLATE";
  local @lines = <FHAND>;
  close FHAND;
  grep(s/\%\%EXCEL\%\%/$EXCELFILE/,@lines);
  grep(s/\%\%SCRIPT\%\%/$SCRIPTNAME/,@lines);
  grep(s/\%\%STAFF\%\%/$stafflist/,@lines);
  grep(s/\%\%STUDENTS\%\%/$studentlist/,@lines);
  grep(s/\%\%ALL\%\%/$alllist/,@lines);
  grep(s/\%\%DATE\%\%/$now/,@lines);
  grep(s/\%\%FOOTNOTES\%\%/$footnotes/,@lines);
  open FHAND,">$OUTPUTFILE";
  print FHAND @lines;
  close FHAND;
}

sub slurpdata {
  my @result = ();
  open FHAND,"<$DATAFILE";
  my $header = <FHAND>;
  chomp $header;
  my @fields = split("\t",$header);
  while (<FHAND>) {
    chomp;
    my @line = split("\t");
    my %hash = (); my $lcv = 0;
    foreach $term (@line) {
      $hash{$fields[$lcv]} = $term;
      $lcv++;
    }
    push(@result,\%hash);
  }
  close FHAND;
  return @result;
}

sub filter {
  my ($term, @mopdata) = @_;
  my @result = ();
  foreach $hashref (@mopdata) {
    my %hash = %$hashref;
    push(@result,\%hash) if ($hash{$term} eq 'TRUE');
  }
  return @result;
} 

sub makefootnotes {
  my $answer = "";
  foreach $hashref (@_) {
    local %person = %$hashref;
    if ($person{'Comments'} ne "") {
      $answer .= "$person{'First'} $person{'Last'}: $person{'Comments'}<BR>\n";
    }
  }
  if ($answer ne "") {
    $answer = "<a name = \"footnotes\"></a><h2>Footnotes</h2>\n$answer";
  }
  return $answer;
}

sub maketable {
  my $answer = "\t\t<table border=\"\" valign=\"TOP\">\n";
  $answer .= "\t\t\t<tr>\n";
  $answer .= "\t\t\t<td><center><b>Updated</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>Name</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>MOP</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>IMO</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>Staff</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>Occupation</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>Affiliation</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>E-mail</b></center></td>\n";
  $answer .= "\t\t\t<td><center><b>Main Webpage</b></center></td>\n";
  $answer .= "\t\t\t</tr>\n";
  foreach $hashref (@_) {
    local %person = %$hashref;
    my $lastup = $person{'Last Update'};
    $lastup = "Unknown" if ($lastup =~ /1\/1\/96/);
    my $mopyears = &getmopyears();
    my $imoyears = &getimoyears();
    my $staffyears = &getstaffyears();
    my $mail = &crunchmail();
    my $page = $person{'Webpage'};
    if ((length $page) < 60) {
      $page = "<a href=\"$page\">$page</a>";
    } else {
      $page = "<a href=\"$page\">[long URL]</a>";
    }
    my $hasfeet = '';
    if ($person{'Comments'} ne "") {
      $hasfeet = '<a href="#footnotes">*</a>';
    }

    $answer .= "\t\t\t<tr valign=\"TOP\">\n";
    $answer .= "\t\t\t<td>$lastup</td>\n";
    $answer .= "\t\t\t<td>$person{'First'} $person{'Last'}$hasfeet</td>\n";
    $answer .= "\t\t\t<td>$mopyears</td>\n";
    $answer .= "\t\t\t<td>$imoyears</td>\n";
    $answer .= "\t\t\t<td>$staffyears</td>\n";
    $answer .= "\t\t\t<td><font size = -1>$person{'Occupation'}</font></td>\n";
    $answer .= "\t\t\t<td><font size = -1>$person{'Affiliation'}</font></td>\n";
    $answer .= "\t\t\t<td><font size = -1>$mail</font></td>\n";
    $answer .= "\t\t\t<td><font size = -2>$page</font></td>\n";
    $answer .= "\t\t\t</tr>\n";
  }
  $answer .= "\t\t</table>\n";
  return $answer;
}

sub crunchmail {
  my $answer = "";
  $mail = $person{'Email'};
  @addresses = split(';',$mail);
  foreach $addr (@addresses) {
    $answer .= &munge($addr);
    $answer .= "<br>";
  }
  $answer =~ s/\<br\>$//;
  return($answer);
}

sub munge {
  return ("None") if $_[0] =~ /^None$/;
  return ("Unlisted") if $_[0] =~ /^Unlisted$/;
  my ($username, $location) = split('@',$_[0]);
  my $mloc = join('.',reverse split(/\./,$location)); 
  return "$username at $mloc";
}

sub getmopyears {
  my @yrs = &getyears('IMO','MOP');
  @yrs = @yrs;
  my $answer = "";
  $answer = &formatyears(@yrs);
  return($answer);
}
sub getimoyears {
  my @yrs = &getyears('IMO');
  my $answer = "";
  $answer = &formatyears(@yrs);
  return($answer);
}
sub getstaffyears {
  my @yrs = &getyears('Staff');
  my $answer = "";
  $answer = &formatyears(@yrs);
  return($answer);
}

sub getyears {
  my @checks = @_;
  my @answer = ();
  for $year ($MINYEAR..$MAXYEAR) {
    $found = 0;
    for $searchterm (@checks) {
      if (defined $person{$year}) {
        if ($searchterm eq $person{$year}) {
          $found = 1;
          last;
        }
      }
    }
    if ($found == 1) {
      push @answer, $year;
    }
  }
  return(@answer);
}

sub formatyears {
  return "" if ($#_ == -1);
  $answer = $_[0];
  foreach $year (@_) {
    $last = substr($answer,-4);
    next if ($last == $year);
    if ($last+1 == $year) {
      if ($answer =~ /\-....$/) {
        substr($answer,-4) = $year;
      } else {
        $answer .= '-'.$year;
      }
    } else {
      $answer .= '<br>'.$year;
    }
  }
  $answer =~ s/\d\d(\d\d)/$1/g;
  return($answer);
}

local @sortdata = sort byweight (@mopdata);

sub byweight {
  my %a = %$a;  
  my %b = %$b;  
#  print $a{'Last'}, " has weight ",$a{'weight'}, " and ",
#    $b{'Last'}, " has weight ",$b{'weight'},"\n";
  return (-($a{'weight'} <=> $b{'weight'}));
}

sub calcweights {
  foreach $hashref (@mopdata) {
    $val = 12345.6;
    $weight = 0;
    for $year ($MINYEAR..$MAXYEAR) {
      if (defined $$hashref{$year} and $$hashref{$year}) {
        $weight += $val*(2050-$year);
        $vv = $$hashref{$year};
        if ($vv eq 'Staff') { $weight += $val*(0.6); }
        if ($vv eq 'IMO') { $weight += $val*(0.3); }
        $val /= 230;
      }
    }
    $$hashref{'weight'} = $weight;
  }
}

