#! /usr/bin/env perl

# 
# Copyright 1999-2006 University of Chicago
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 


=head1 NAME

B<globus-update-doxygen-index> - Replace the share/doc/index.html file
with one which contains links to all of the installed package documentation.

=head1 SYNOPSIS

B<globus-update-doxygen-index> [path to documentation]

=head1 DESCRIPTION

B<globus-update-doxygen-index> creates an index.html file suitable for
browsing all globus-related documentation located in a documentation
directory.  By default, it builds an index in $GLOBUS_LOCATION/share/doc;
an option command line argument should point to a similarly structured
directory structure in another location.

=cut

my $gpt_path;
my $globus_path;

BEGIN {
    $gpt_path = $ENV{GPT_LOCATION};
    if (!defined($gpt_path))
    {
      $gpt_path = $ENV{GLOBUS_LOCATION};

    }

    $globus_path = $ENV{GLOBUS_LOCATION};

    if (!defined($gpt_path) || !defined($globus_path))
    {
       die "GPT_LOCATION and GLOBUS_LOCATION need to be set before running this script"
    }
    push(@INC, "$gpt_path/lib/perl");
}

use strict;
use IO::File;

use Grid::GPT::PackageFactory;


my %pkgs = ();
my %functional_groups = ();
my %descs = ();

my $docpath="$globus_path/share/doc";
if(defined($ARGV[0]))
{
    $docpath = $ARGV[0];
}
my $output_docpath;
if(defined($ARGV[1]))
{
    $output_docpath = $ARGV[1];
}

print "Searching documentation tree $docpath\n";

foreach (glob("$docpath/*"))
{
    my $nonempty = `wc -l $_/html/*.tag 2> /dev/null`;
    chomp($nonempty);
    if($nonempty > 3)
    {
        my $pkgname = $_;
        $pkgname =~ s|.*/||g;

        $pkgs{$pkgname} = $pkgname;
    }
}

print "Sorting into functional groups\n";
foreach (keys %pkgs) {
    my $package_factory = new Grid::GPT::PackageFactory();
    my @package_files = glob("$globus_path/etc/globus_packages/$_/pkg_data*.gpt");
    my $package_file = $package_files[0];

    if ($package_file eq '') {
        print "No package data for $_\n";
        next;
    }
    my $package = $package_factory->type_of_package($package_file);
    $package->read_metadata_file($package_file);

    push(@{$functional_groups{$package->{Functional_Group}}}, $_);
    $descs{$_} = $package->{Description};
}

if ($output_docpath ne '') {
    $docpath = $output_docpath;
}
my $file = new IO::File(">$docpath/index.html")
    || die "unable to write to $docpath/index.html";
print $file <<EOF;

<html>
<head>
<title>API Documentation</title>
<link href="globus.css" title="Globus" rel="stylesheet" type="text/css">
</head>
<body>
<h1>API Documentation</h1>

EOF

foreach (keys %functional_groups)
{
    my $group = $_;
    $group =~ s|.*/||;

    print $file "<h2>$_</h2>\n";

    print $file "<ul>\n";

    foreach my $pkg (@{$functional_groups{$_}})
    {
        print $file <<EOF;
            <li> <a href='$pkgs{$pkg}/html/index.html' target='_top'>$descs{$pkg}</a>
                [<a href='$pkgs{$pkg}/html/main.html' target='_top'>no frames</a>]
            </li>
EOF
    }
    print $file "</ul>\n";
}
print "Done\n";

print $file "</body></html>\n";

$file->close();

print "Run the following command to modify the documention for globus.org stylesheets:\n";
print "find $docpath -name \"*.html\" -print | xargs sed -i \"s#globus.css#/toolkit/css/c-api.css#\" \n";

