#! perl
########################################################################
# COPYRIGHT - VIX IP PTY LTD ("VIX"). ALL RIGHTS RESERVED.
#
# Module name   : jats.sh
# Module type   : Makefile system
# Compiler(s)   : n/a
# Environment(s): jats
#
# Description   : Uses a "raw_data.txt file to extract data to draw pretty
#                 pictures. Not used any more
#
# Usage:
#
# Version   Who      Date        Description
#
#......................................................................#

require 5.006_001;
use strict;
use warnings;
use Data::Dumper;
use Cwd;


#-------------------------------------------------------------------------------
#   Globals
#
my %packages;
my %required_packages;
my %needed_by;


#-------------------------------------------------------------------------------
#   Read in the build.xml file
#

open FH, '<raw_data.txt' or die "Can't open build.xml";
while ( <FH> )
{
    chomp;
#    print "$_\n";

    AddPackage( $_ );

}
close FH;

#
#   Display results
#

DebugDumpData ('Packages', \%packages );
DebugDumpData ('Inverse', \%needed_by );


#
#   Extract package information
#   Given a package 'xxx' determine the packages that are needed to build it
#
#AddToPackages( 'daf_br.syd' , 'daf_services.syd' );# , 'AVMApplicationEngine.syd', 'AVMComponentLayer.syd', 'gate_ferry.syd', 'gate_monorail.syd', 'gate_rail.syd', 'hcp5000.syd', 'IDC.syd', 'IDCDB.syd', 'ocp5000.syd', 'PDTD.syd', 'safpd.syd', 'ssu5000.syd', 'StaAvmMainIo.syd', 'tp5000.syd', 'vcp5000.syd');
AddToPackages( 'safpd.syd' );

DebugDumpData ('Needed Packages', \%required_packages );

#
#   Display details of the required packages
#
print "Required Packages and versions\n";
foreach my $alias ( sort keys %required_packages )
{
    my $name       = $packages{$alias}{'name'};
    my $ext        = $packages{$alias}{'ext'};
    my $version    = $packages{$alias}{'version'};
    my $label      = $packages{$alias}{'label'};
    my $path       = $packages{$alias}{'path'};

    print STDERR "ERROR: No name for: $alias\n" unless $name;
    print STDERR "ERROR: No version for: $alias\n" unless $version;


    my $pname = $name . '_' . $version;
    $pname .= $ext if ( $ext );



    printf( "%-40s, %-50s, %s\n", $pname, $label, $path);
}

exit 0;

#-------------------------------------------------------------------------------
# Function        : AddPackage
#
# Description     : Extract package information
#
# Inputs          :
#
# Returns         :
#
sub AddPackage
{
    my %data;
    my ( $line ) = @_;
    my ( $alias, $name, $ext, $version, $planned, $label, $path, @depends )
                = split ',', $line;

#    print "Name: $data{name}\n";
#    print "Value:$data{value}\n";

    $label = '' if ( !$label || $label =~ m~^n/?a$~i || $label =~ m~^none$~i);
    $path  = '' if ( !$path || $path =~ m~^n/?a$~i || $path =~ m~^none$~i || $path =~ m~^not applicable$~i);


    unless ( $path =~ m~^/\w~ )
    {
        printf ("WARNING: Bad path: %-40s : %s\n", $alias, $path );
    }

    $packages{$alias}{'name'} = $name;
    $packages{$alias}{'ext'} = $ext;
    $packages{$alias}{'version'} = $version;
    $packages{$alias}{'plannel'} = $planned if $planned;
    $packages{$alias}{'label'} = $label;
    $packages{$alias}{'path'} = $path;

    my @clean_depends;
    foreach ( @depends )
    {
        s~\${~~;
        s~}~~;
        push @clean_depends, $_;
        push @{$needed_by{$_}}, $alias;
        
    }

    $packages{$alias}{'depends'} = \@clean_depends;
}

#-------------------------------------------------------------------------------
# Function        : AddToPackages
#
# Description     : Add packages to the list of required packages
#
# Inputs          :
#
# Returns         :
#
sub AddToPackages
{
    foreach my $pkg ( @_ )
    {
        next if ( exists $required_packages{$pkg} );

        if ( exists $packages{$pkg} )
        {
            AddToPackages( @{$packages{$pkg}{'depends'}})
        }
        else
        {
            print "ERROR: Package not found: $pkg\n";
        }

        $required_packages{$pkg} = 1;

    }
}

#-------------------------------------------------------------------------------
# Function        : DebugDumpData
#
# Description     : Display data structures
#
# Inputs          :
#
# Returns         :
#
sub DebugDumpData
{
    my ($name, @refp) = @_;

    my $ii = 0;
    foreach  ( @refp )
    {
        print Data::Dumper->Dump ( [$_], ["[Arg:$ii] $name" ]);
        $ii++
    }
}



