#!/usr/bin/perl

use strict;
use Cwd;
use Data::Dumper;
use File::Find;

my ($projectName, $majVer, $minVer);
my (@content, @allProjectNames);
my $projectRootName = $ARGV[0];
my $installMode = $ARGV[1]; # 0: remove & install all (include, lib, doc)
                            # 1: remove & install include, lib
                            # 2: remove & install doc
                            # 3: remove & install as link include, lib

#------------------
#Get version number
#------------------
open(FILE,"../makeVar") or die "Can not open file: $!";
@content = <FILE>;
close(FILE);

foreach my $line(@content) {
    if ($line =~ /^TARGET_MAJVERSION:= (\d+)/) {
        $majVer = $1;
    }
    
    if ($line =~ /^TARGET_MINVERSION:= (\d+)/) {
        $minVer = $1;
    }   
}

#---------------------------
#Walk through directory tree
#---------------------------
opendir(DIR,"..") or die "Can not open DIR: $!";
my @dirs = readdir(DIR);
closedir(DIR);

my $INSTALLDIR="$ENV{AGNI_LOCAL_ROOT}/${projectRootName}/${majVer}.${minVer}";

#---- Remove old install tree before installing the new one ----
if ($installMode == 0 || $installMode == 1 || $installMode == 3) {
    print "---- Remove header files in: $INSTALLDIR/include \n";
    system "rm $INSTALLDIR/include/*.h";
    print "---- Remove libraries in: $INSTALLDIR/lib \n";
    system "rm $INSTALLDIR/lib/*";
}

if ($installMode == 0 || $installMode == 2) {
    print "---- Remove docs in: $INSTALLDIR/doc \n";
    system "rm -R $INSTALLDIR/doc/*";
}

#---- Create directory tree ----
if (!-e "$INSTALLDIR"){
    print "make dir: $INSTALLDIR\n";
    system "mkdir -p $INSTALLDIR";
    }

if (!-e "$INSTALLDIR/lib"){
    print "make dir: $INSTALLDIR/lib\n";
    system "mkdir $INSTALLDIR/lib";
    }

if (!-e "$INSTALLDIR/include"){
    print "make dir: $INSTALLDIR/include\n";
    system "mkdir $INSTALLDIR/include";
    }

if (!-e "$INSTALLDIR/doc"){
    print "make dir: $INSTALLDIR/doc\n";
    system "mkdir $INSTALLDIR/doc";
}

#---- Copy content to install dir ----
system "cp ./BashSrc $INSTALLDIR";
system "cp ./packageVar $INSTALLDIR";

foreach my $entry(@dirs) {
    if ($entry !~ /^\./ ){        
        if (opendir(DIR,"../".$entry)) {
            my $curdir=&Cwd::cwd();
            while (my $subentry=readdir(DIR)) {
                if ($installMode == 0 || $installMode == 1) { 
                    if ($subentry eq 'src'){
                        print "---- Copying header files: $entry/$subentry\n";
                        system "cp ../$entry/$subentry/*.h $INSTALLDIR/include"
                        }
                    elsif ($subentry eq 'lib'){
                        print "---- Copying libraries: $entry/$subentry\n";
                        system "cp -d ../$entry/$subentry/*.so* $INSTALLDIR/lib";
                        system "cp -d ../$entry/$subentry/*.a $INSTALLDIR/lib";
                    }
                    elsif ($subentry !~ /^\./ ){
                        push(@dirs,"$entry/$subentry");
                    }
                }
                if ($installMode == 3) {
                    if ($subentry eq 'src'){
                        my @allHeaders = ();
                        &File::Find::find( sub {push @allHeaders, $_;}, 
                                           "$curdir/../$entry/$subentry/*.h" );
                        print "---- Linking header files: $entry/$subentry\n";
                        system "ln -s $curdir/../$entry/$subentry/*.h $INSTALLDIR/include"
                        }
                    elsif ($subentry eq 'lib'){
                        print "---- Linking libraries: $entry/$subentry\n";
                        system "ln -s $curdir/../$entry/$subentry/*.so* $INSTALLDIR/lib";
                        system "ln -s $curdir/../$entry/$subentry/*.a $INSTALLDIR/lib";
                    }
                    elsif ($subentry !~ /^\./ ){
                        push(@dirs,"$entry/$subentry");
                    }
                }
                if ($installMode == 0 || $installMode == 2) {
                    if ($subentry eq 'doc'){
                        if (!-e "$INSTALLDIR/doc/$entry"){                   
                            ($projectName) = $entry =~ /.*\/(.+?)$/;
                            if (!$projectName) {
                                $projectName = $entry;
                            }
                            push(@allProjectNames, $projectName);
                            system "mkdir $INSTALLDIR/doc/$projectName";
                        }
                        print "---- Copying documentation: $entry/$subentry\n";
                        system "cp -r ../$entry/$subentry/documentation/* $INSTALLDIR/doc/$entry";
                    }
                    elsif ($subentry !~ /^\./ ){
                        push(@dirs,"$entry/$subentry");
                    }
                }
            }
            closedir (DIR);
        }
    }
}

if ($installMode == 0 || $installMode == 2) {
    generate_documentation($INSTALLDIR, @allProjectNames);
}

#---------------------
# Remove all .svn dirs
#---------------------
system "find $INSTALLDIR -name '.svn' -exec rm -Rf {} \\; 2> /dev/null";

exit(0);

#----------------------------------------------------------------------------- 
sub generate_documentation {
    my ($INSTALLDIR, @projects) = @_;
    my $menuTable = "";
    
    #---- Copy static documentation files ----
    system "mkdir $INSTALLDIR/doc/html";
    system "cp -r ../doc/html/* $INSTALLDIR/doc/html";
    
    #---- Generate menu content ----
    @projects = sort(@projects);
    $menuTable .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
    $menuTable .= "<html>\n";
    $menuTable .= "<head>\n";
    $menuTable .= "<meta http-equiv=\"Content-Language\" content=\"de\">\n";
    $menuTable .= "<meta http-equiv=\"Content-Type\"\n";
    $menuTable .= "content=\"text/html; charset=windows-1252\">\n";
    $menuTable .= "<title>Menu</title>\n";
    $menuTable .= "<base target=\"Inhalt\">\n";
    $menuTable .= "</head>\n";
    $menuTable .= "<body>\n";
    $menuTable .= "<div align=\"center\">\n";
    $menuTable .= "<table border=\"0\" width=\"100%\" id=\"table1\" bgcolor=\"#C0C0C0\" cellspacing=\"1\" cellpadding=\"0\">\n";
    $menuTable .= "<tr>\n";
    $menuTable .= "<td>\n";
    $menuTable .= "<div align=\"center\">\n";
    $menuTable .= "<table border=\"0\" width=\"100%\" id=\"table2\" bgcolor=\"#C0C0C0\" cellspacing=\"4\" cellpadding=\"0\"\n";
    $menuTable .= "<tr>\n";
    $menuTable .= "<td>\n";
    $menuTable .= "<p align=\"center\"><font color=\"#000080\"><u><b>Main menu</b></u>\n";
    $menuTable .= "</td>\n";
    $menuTable .= "</tr>\n";

    foreach my $project (@projects) {
        $menuTable .= "<tr><td> <a href=\"../".$project."/html/index.html\" target=\"MainFrame\">".$project."</a></td>\n";
    }
    
    $menuTable .= "</table>\n";
    $menuTable .= "<br>\n";
    $menuTable .= "</body>\n";
    $menuTable .= "</html>\n";
    
    #---- Write menu.html ----
    open(FILE, ">$INSTALLDIR/doc/html/menu.html") or die "cannot write to menu.html:$!";
    print FILE $menuTable;
    close(FILE);
}