#!/usr/local/bin/perl -w

use DeployUtils::RmPkgInfo;
use DeployUtils::Logger;
use Getopt::Std;

our ( $opt_h, $opt_d, $opt_n, $opt_v, $opt_p, $opt_r, $opt_c );

my $Rm;
my %PkgInfo;
my $maxLevel = 0;

getopts('hd:n:v:pr:c');

if ( defined($opt_h) || ! defined($opt_r) )
{
    print "Must Supply -r along with (-n & -v) or -p\n";
    exit;
}

setLogLevel($opt_d) if ( defined($opt_d) );

if ( defined($opt_p) )
{
    foreach my $pvid ( @ARGV )
    {
        walktree($opt_n, $opt_v, $pvid, $opt_r, 0);
    }
}
else
{
    walktree($opt_n, $opt_v, $opt_p, $opt_r, 0);
}

if ( defined($opt_c) )
{ 
    for( my $level = 0; $level <= $maxLevel; $level++ )
    {
        foreach my $i ( keys %PkgInfo )
        {
            if ( $PkgInfo{$i} == $level )
            {
                printf("%d %s%s\n", $level, " " x ($level*4), $i );
            }
        }
    }
}
        



sub walktree
{
    my ( $name, $ver, $pvid, $rtag, $level ) = @_;
    my $debugLine = "";
    my $pkgName;
        
    $debugLine .= "Name[$name] " if ( defined($name) );
    $debugLine .= "Version[$ver] " if ( defined($ver) );
    $debugLine .= "PvId[$pvid] " if ( defined($pvid) );
    $debugLine .= "RtagId[$rtag] " if ( defined($rtag) );
    $debugLine .= "Level[$level] " if ( defined($level) );

    $maxLevel = $level if ( $level > $maxLevel );

    LogDebug("WalkTree: Looking for $debugLine");
    $Rm = DeployUtils::RmPkgInfo->new({ PKG_NAME => $name, PKG_VERSION => $ver, PV_ID => $pvid, RTAG_ID => $rtag });
    if ( $Rm->foundDetails() )
    {
        $pkgName = $Rm->pkg_name();
        LogDebug("WalkTree: Found Pkg Details [$pkgName], getting RtDeps");
        # if opt_c then we are doing a consise list so lets populate hash
        if ( defined($opt_c) )
        {
            if ( defined( $PkgInfo{$pkgName} ) && $level <= $PkgInfo{$pkgName} )
            {
                LogDebug("WalkTree: Tree Rooted at [$pkgName] already seen at lower level [$PkgInfo{$pkgName}], pruning tree");
                return;
            }
            elsif ( defined( $PkgInfo{$pkgName} ) && $level > $PkgInfo{$pkgName} )
            {
                LogDebug("WalkTree: Moving [$pkgName] to a higher level [$PkgInfo{$pkgName}] to [$level]");
            }
            $PkgInfo{$pkgName} = $level;
        }
        # else just print current item at the current level
        else
        {
            printf("%d %s%s\n", $level, " " x ($level*4), $pkgName );
        }

        $Rm->getRtDeps();
        if ( $Rm->foundRtDeps() )
        {
            foreach my $rtDep ( $Rm->getRtDepNames() )
            {
                LogDebug("WalkTree: Walking  [$pkgName]:[$rtDep]");
                # Get details for the next rt dep using rtag to find latest version
                walktree($rtDep, undef, undef, $rtag, $level + 1);
            }
        }
        else
        {
            LogWarn("WalkTree:  Unable to find RunTime Details for $debugLine");
        }
    }
    else
    {
        LogWarn("WalkTree:  Unable to find Details for $debugLine");
    }
}


