#!/opsw/hst/bin/perl

print "Content-type: text/plain\n\n";

require 'libECF.pl';

my( $DBFILE ) = "partite.db";
my( %alias, $maxlen, $terminal, $magicterm );

&Init;

( $ra_risultati, $ra_casa, $ra_fuori ) = &read_db( $DBFILE );
@risultati = @$ra_risultati;

&print_risultati( @risultati );
print "\n";
&print_classifica( $ra_casa, $ra_fuori );

sub read_db
{
   my( $i_squadra );
   open(I,"<$DBFILE") || die " *** Cannot open DBFILE ($DBFILE).\n";
   while(<I>)
   {
      chomp;
      if ( /^\s*$/ ) { next; }
      if ( /\s*(.*?)\s*=\s*(.*?)\s*$/ ) 
      {
         my( $alength ) = length( $2 );
         if ( $alength > $maxlen ) 
         {
            $maxlen = length( $2 );
         }
         $alias{ $1 } = $2;
         next;
      }

      #
      # Header
      #

      if ( /^\|\|/ )
      {
         s/^\|\|//g;
         s/\|\|$//g;
         @hcells = split(/\|\|/);

         foreach $hcell ( @hcells )
         {
             $hcell =~ s/^\s*//g;
             $hcell =~ s/\s*$//g;

             if ( $hcell =~ /^\s*$/i ) { next; }
             if ( $hcell =~ /^\s*x\s*$/i ) { next; }
             
             $ateam_alias = $hcell;
             push( @team_aliases, $ateam_alias );
         }
      }

      #
      # Table body
      #

      elsif ( /^\|/ )
      {
         s/^\|//g;
         s/\|$//g;
         s/^\s*//g;
         s/\s*$//g;

         @cells = split(/\|/);

         $alias_squadra_casa = shift @cells;
         $alias_squadra_casa =~ s/^\s*//g;
         $alias_squadra_casa =~ s/\s*$//g;

         $i_squadra = -1;

         foreach $cell ( @cells )
         {
             $i_squadra++;

             $cell =~ s/^\s*//g;
             $cell =~ s/\s*$//g;

             if ( $cell =~ /^$/ ) { next; }
             if ( $cell =~ /X/i ) { next; }

             $alias_squadra_fuori = $team_aliases[ $i_squadra ];
             ( $giornata, $risultato ) = split(/\s+/, $cell );

             my( $ris );
             if ( $risultato =~ /.*-.*/ )
             {
                ( $gc, $gf ) = split(/-/, $risultato );

                $ris = sprintf "G %2d: %-${maxlen}s - %-${maxlen}s    %2d - %2d",
                               $giornata,
                               $alias{ $alias_squadra_casa },
                               $alias{ $alias_squadra_fuori }, $gc, $gf ;
             }
             else
             {
                # Qui le partite sospese, non giocate, etc.
                $ris = sprintf "G %2d: %-${maxlen}s - %-${maxlen}s     NON DISPUTATA",
                               $giornata,
                               $alias{ $alias_squadra_casa },
                               $alias{ $alias_squadra_fuori };
             }
                              

             push( @risultati, $ris );

             if ( $ris =~ /NON DISPUTATA/ ) { next; }

             $tcasa = $alias_squadra_casa;
             $tfuori = $alias_squadra_fuori;

             $casa_punti = 3 if ( $gc > $gf );
             $casa_punti = 1 if ( $gc == $gf );
             $casa_punti = 0 if ( $gc < $gf );

             $fuori_punti = 3 if ( $gf > $gc );
             $fuori_punti = 1 if ( $gf == $gc );
             $fuori_punti = 0 if ( $gf < $gc );

             ${$tcasa}[ $giornata ]{'punti'} = $casa_punti;
             ${$tcasa}[ $giornata ]{'goal_fatti'} = $gc;
             ${$tcasa}[ $giornata ]{'goal_subiti'} = $gf;
             ${$tcasa}[ $giornata ]{'avversario'} = $tfuori;
             ${$tcasa}[ $giornata ]{'in_casa'} = 1;

             ${$tfuori}[ $giornata ]{'punti'} = $fuori_punti;
             ${$tfuori}[ $giornata ]{'goal_fatti'} = $gf;
             ${$tfuori}[ $giornata ]{'goal_subiti'} = $gc;
             ${$tfuori}[ $giornata ]{'avversario'} = $tcasa;
             ${$tfuori}[ $giornata ]{'in_casa'} = 0;
         }
      }
   }
   close(I);

   return( \@risultati ); # \@casa, \@fuori );
}

sub print_classifica
{
   foreach $squadra ( sort keys %alias )
   {
      $punti = 0;
      $mi = 0;
      $gf = 0;
      $gs = 0;
      $gfc = 0;
      $gsc = 0;
      $gff = 0;
      $gsf = 0;
      %vnp = (VC => 0, NC => 0, PC => 0, VF => 0, NF => 0, PF => 0);
      foreach $giorn ( @{$squadra} )
      {
         if ( $giorn->{'punti'} eq "" ) { next; }
   
         $punti += $giorn->{'punti'};
         $in_casa = $giorn->{'in_casa'};
   
         $gf += $giorn->{'goal_fatti'};
         $gs += $giorn->{'goal_subiti'};
   
         if ( $in_casa )
         {
            $gfc += $giorn->{'goal_fatti'};
            $gsc += $giorn->{'goal_subiti'};
         }
         else
         {
            $gff += $giorn->{'goal_fatti'};
            $gsf += $giorn->{'goal_subiti'};
         }
   
         $mi += $giorn->{'punti'} - 3*$in_casa -1*(1- $in_casa);
   
         if ( $in_casa )
         {
            if ( $giorn->{'punti'} == 3 ) { $vnp{'VC'}++; }
            elsif ( $giorn->{'punti'} == 1 ) { $vnp{'NC'}++; }
            elsif ( $giorn->{'punti'} == 0 ) { $vnp{'PC'}++; }
         }
         else
         {
            if ( $giorn->{'punti'} == 3 ) { $vnp{'VF'}++; }
            elsif ( $giorn->{'punti'} == 1 ) { $vnp{'NF'}++; }
            elsif ( $giorn->{'punti'} == 0 ) { $vnp{'PF'}++; }
         }
   
      }
      $totcasa = $vnp{'VC'}+ $vnp{'NC'}+ $vnp{'PC'};
      $totfuori = $vnp{'VF'}+ $vnp{'NF'}+ $vnp{'PF'};

      $rec = sprintf "%-${maxlen}s %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %3d %3d %3d\n",
                $alias{ $squadra }, $punti, $totcasa + $totfuori,
                $totcasa, $vnp{'VC'}, $vnp{'NC'}, $vnp{'PC'}, $gfc, $gsc,
                $totfuori, $vnp{'VF'}, $vnp{'NF'}, $vnp{'PF'}, $gff, $gsf,
                $gf, $gs, $mi;

        push( @classifica, $rec );
   }

   #
   # PRINT CLASSIFICA
   #

   @out = sort {
                 my @a = split(/\s+/, $a);
                 my @b = split(/\s+/, $b);

                 $b[1] <=> $a[1]  ||  $b[14] <=> $a[14]

               } @classifica;

#@out = sort {
#
#    pack('C2' => $b =~
#
#      /\D+\s+(\d+)\s+.*\s+(\d+)\s*$/)
#
#    <=>
#
#    pack('C2' => $a =~
#
#      /\D+\s+(\d+)\s+.*\s+(\d+)\s*$/)
#
#  } @classifica;

#                $alias{ $squadra }, $punti, totgiocate
#                totcasa, $vnp{'VC'}, $vnp{'NC'}, $vnp{'PC'}, $gfc, $gsc,
#                totfuori, $vnp{'VF'}, $vnp{'NF'}, $vnp{'PF'}, $gff, $gsf,
#                $gf, $gs, $mi;

$header = sprintf "%-${maxlen}s |  P |  G || GC  VC NC PC | GFC GSC || GF  VF NF PF | GFF GSF || GFT GST |  MI |\n",
                  substr( "Team", 0, $maxlen);
print $header;
print "-" x (length($header)-1),"\n";

foreach $out ( @out )
{
   ( @toprint ) = split(/\s+/, $out );
#   print $out;
   $record = sprintf "%-${maxlen}s | %2d | %2d || %2d  %2d %2d %2d | %3d %3d || %2d  %2d %2d %2d | %3d %3d || %3d %3d | %+3d |",  @toprint;

   use Term::ANSIColor qw(:constants);
   if ( $terminal && $record =~ /$magicterm/ )
   {
      print ON_GREEN, $record, RESET, "\n";
   }
   else
   {
      print $record, "\n";
   }
}

}

sub print_risultati
{
   my( @res ) = @_;
   use Term::ANSIColor qw(:constants);

   foreach $ris ( sort @res )
   {
      if( $terminal && $ris =~ /^(.*)$magicterm(.*)$/ )
      {
          print $1, ON_GREEN, "$magicterm", RESET, $2, "\n";
      }
      else
      {
         print $ris,"\n";
      }
   }
}

sub Init
{
   $magicterm = "Garching";
   $terminal = 0;

   $roptions = &cl_args(@ARGV);
   foreach $opt ( @$roptions )
   {
     if ( $opt eq "-m" )    { $magicterm = ${${ECF_m}}[0]; undef ${ECF_m}; }
     elsif ( $opt eq "-t" ) { $terminal = 0; undef ${ECF_t} }
   }
}
