#! /usr/bin/perl

use strict;

# Add here the pages of the documentation generated by a @page doxygen macro
my @extra_files = qw(html/index.html html/faq.html html/publis.html html/pages.html html/modules.html html/contrib.html index.php html/GRAS_tut.html);

map {push @extra_files, "html/GRAS_tut_$_.html"} qw (intro 
                                                     tour tour_install tour_setup tour_simpleexchange tour_args tour_callbacks tour_globals 
                                                          tour_logs tour_timers tour_exceptions tour_rpc);

my %debug;
$debug{'parse'} = 0; # show how we parse the module tree
$debug{'input'} = 0; # display the resulting tree
$debug{'handle'}= 0; # Be verbose on the post-processing
$debug{'rename'}= 0; # do not overwrite the files (allows several debuging runs without rerunning doxygen)

my @allfiles;
###
### Get the module definitions
###

open IN, "html/modules.html" || die "Cannot parse html/modules.html. Did you really run doxygen?\n";

# pass headers
while (<IN>) {
  last if /group__SimGrid__API.html/;
}

# Parse the tree
my $top;
my $current;
my $entry;

$current->{'label'}="ROOT";
push @{$top->{'down'}},$current;
$current=$top;

print "Push $current as child of $top\n" if $debug{'parse'};

while (<IN>) {
  if (/<ul>/) {
    print "DOWN: $current -> " if $debug{'parse'};
    $current = $current->{'down'}[scalar @{$current->{'down'}} - 1];
    print "$current\n" if $debug{'parse'};
    next;
  }
  if (/<\/ul>/) {
    $current = $current->{'up'};
    print "UP\n" if $debug{'parse'};
    next;
  }
  if (/<p>/) {
    last;
  }
  
  m|href="([^"]*)">([^<]*)</a>|; #"
  
  $entry = {};
  $entry->{'file'} = $1;  
  $entry->{'label'} = $2;
  $entry->{'up'} = $current;
  push @{$current->{'down'}},$entry;
  print "Push $1 $2 as child of $current\n" if $debug{'parse'};
  push @allfiles,"html/$1";
}
close IN;

# Check each file for extra information (short name, extra childs)
sub extra_info {
  my $current=shift;

  if (defined($current->{'file'})) {
    open IN, "html/$current->{'file'}";
    while (<IN>) {
      if (/DOXYGEN_NAVBAR_LABEL/) {
        if (/DOXYGEN_NAVBAR_LABEL="([^"]*)"/) {#"
          $current->{'label'}=$1;
        } else {
          die "Malformated DOXYGEN_NAVBAR_LABEL line in $current->{'file'}";
        }
      }
      if (/DOXYGEN_NAVBAR_CHILD/) {
        if (/DOXYGEN_NAVBAR_CHILD *"([^"]*)"=([^ ]*)/) {#"
          $entry = {};
          $entry->{'label'} = $1;
          $entry->{'file'} = $2;
          chomp($entry->{'file'});
          $entry->{'up'} = $current;
          push @{$current->{'down'}},$entry;
        } else {
          die "Malformated DOXYGEN_NAVBAR_CHILD line in $current->{'file'}";
        }
      }
    }
  }
  
  foreach my $entry (@{$current->{'down'}}) {
    extra_info($entry);
  }  
}
extra_info($top);

## debug function
sub display {
  my $current=shift;
  my $level=shift;
  print "  " x $level;
  print "$current: ".$current->{'label'}." ($current->{'file'})\n";
  foreach my $entry (@{$current->{'down'}}) {
    display($entry,$level+1);
  }
}

display($top,0) if $debug{'input'};

###
### Generate the navbar
###

# the root deserves some special handling
open IN,"html/modules.html" || die;
open OUT,">html/modules.new.html" || die;
my $line;
while ($line = <IN>) {
  last if $line =~ /<h1>SimGrid Modules</;
  print OUT $line;
}

print OUT "<div class=\"tabs\">\n  <ul>\n";
foreach $current (@{ ${$top->{'down'}}[0]->{'down'} }) {
  print OUT "   <li><a href=\"$current->{'file'}\"><span>$current->{'label'}</span></a></li>\n";
}
print OUT "  </ul></div>\n";
print OUT $line;
while (<IN>) {
  print OUT $_;
}

close OUT;
close IN;
rename("html/modules.new.html","html/modules.html") unless $debug{'rename'};

# Operate the recursion
sub handle_page {
  my $current=shift;
  my $level=shift;

  print "Handle $current->{'file'} at level $level\n" if $debug{'handle'};
    
  # we generate the tabs bottom up begining from where we are in the tree
  # and display them top down, as it should in a file
  my @tabs = ();

  if (defined ($current->{'label'}) and $current->{'label'} ne 'ROOT') {
#    print "handle $current->{'file'}, at level $level\n";
    # generate the tabs
    my $iterator = $current;
    my $lvl_it=$level;
    while ($lvl_it >= 0) {
      my $father = $iterator->{'up'};
      $tabs[$lvl_it] = "<div class=\"tabs\">\n  <ul>\n";
      foreach my $bro (@{$father->{'down'}}) {
        $tabs[$lvl_it] .= "  <li".($bro==$iterator?" id=\"current\"":"")."> <a href=\"$bro->{'file'}\"><span>$bro->{'label'}</span></a></li>\n";      
      }
      $tabs[$lvl_it] .= "  </ul></div>\n";
      $iterator = $father;
      $lvl_it--;
    }
    if (defined $current->{'down'}) { # there's some kid. Display them too
      $tabs[$level+1] = "<div class=\"tabs\">\n  <ul>\n";
      foreach my $kid (@{$current->{'down'}}) {
        $tabs[$level+1] .= "  <li> <a href=\"$kid->{'file'}\"><span>$kid->{'label'}</span></a></li>\n";      
      }
      $tabs[$level+1] .= "  </ul></div>\n";      
    }
    
    # put them in place
    open FROM,"html/$current->{'file'}" || die;
    my $newname="html/$current->{'file'}";
    $newname =~ s/.html/.new.html/;
    open TO,">$newname" || die;
    while (<FROM>) {
      # add "current" to the module API granfather page
      s|<li><a href="modules.html"><span>[^<]*</span></a></li>|<li id="current"><a href="modules.html"><span>Modules API</span></a></li>|;
      print TO $_;
      last if m|</ul></div>|;
    }
    foreach (@tabs) {
      print TO $_;
    }
    while (<FROM>) {
      print TO $_;
    }    
    close FROM;
    close TO;
    rename("$newname","html/$current->{'file'}") unless $debug{'rename'};
#    print "mv $newname html/$current->{'file'}\n";
  } 
  
  # recurse on childs
  foreach my $entry (@{$current->{'down'}}) {
    handle_page($entry,$level+1);
  }
}

###
### Launch the modules navbar reworking
###
handle_page($top,-2);# skip roots (we have 2 roots) in level counting


###
### Post-processsing common to all pages
###
map {push @allfiles,$_} @extra_files;

foreach my $file (@allfiles) {
    open FROM,"$file" || die;
    my $outfile = "$file";
    $outfile =~ s/.(html|php)$/.new.$1/;
    open TO,">$outfile" || die;
#    print "POSTPROCESSING $file (tmp=$outfile)\n";
    while (<FROM>) {
      # Add the simgrid css, just in case
      print TO '<link href="simgrid.css" rel="stylesheet" type="text/css">'."\n"
        if (m|</head>|);

      # Rework the navbar
      if (m,<li><a href="(doc/)?index.html"><span>Main\&nbsp;Page</span></a></li>,) {
        print TO '<li><a href="'.$1.'index.html"><span>Overview</span></a></li>'."\n";
        print TO '<li><a href="'.$1.'faq.html"><span>FAQ</span></a></li>'."\n";
        next;
      }
      if (m,<li><a href="(doc/)?annotated.html"><span>Data\&nbsp;Structures</span></a></li>,) {
        print TO '<li><a href="'.$1.'publis.html"><span>Publications</span></a></li>'."\n";
        next;
      }
      s|<span>Modules</span>|<span>Modules API</span>|g;
#      s|<li><a href="(doc/)?dirs.html"><span>Directories</span></a></li>||g;
                                                                                                 
      print TO $_;
    }
    close FROM;
    close TO;
    rename("$outfile", "$file") unless $debug{'rename'};
}



