#! 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   : Create auto.pl for given package
#                 Need rtag_id and pv_id
#
#                 Slow Version
#                   Multiple DB accesses may be slow
#
# Usage:
#
#......................................................................#

require 5.006_001;
use strict;
use warnings;
use JatsError;
use JatsVersionUtils;
use JatsRmApi;
use JatsSystem;

#use Data::Dumper;
use Cwd;
use DBI;
use Getopt::Long;
use Pod::Usage;                             # required for help support

my $GBE_PERL     = $ENV{'GBE_PERL'};        # Essential ENV variables
my $GBE_CORE     = $ENV{'GBE_CORE'};
my $RM_DB;

################################################################################
#   Global data
#
my $VERSION = "1.0.0";
my %ReleasePackages;            # Packages in the release
my %BuildPackages;              # Packages for this build
my $base_name;
my $base_version;
my $base_label;
my $base_path;


#
#   Options
#
my $opt_help = 0;
my $opt_verbose = 0;
my $opt_rtagid;
my $opt_pvid;

my $result = GetOptions (
                "help|h:+"          => \$opt_help,
                "manual:3"          => \$opt_help,
                "verbose:+"         => \$opt_verbose,       # flag or number
                "rtagid|rtag_id=s"  => \$opt_rtagid,
                "pvid|pv_id=s"      => \$opt_pvid,
                );

#
#   Process help and manual options
#
pod2usage(-verbose => 0, -message => "Version: $VERSION")  if ($opt_help == 1  || ! $result);
pod2usage(-verbose => 1)  if ($opt_help == 2);
pod2usage(-verbose => 2)  if ($opt_help > 2);

#
#   Configure the error reporting process now that we have the user options
#
ErrorConfig( 'name'    =>'PLAY19',
             'verbose' => $opt_verbose );


Error( "Need rtagid and pvid" )
    unless ( $opt_rtagid && $opt_pvid );


#
#   Get info the specified package
#
getPkgDetailsBy_PVID ( $opt_pvid );
#DebugDumpData ("BuildPackages", \%BuildPackages );


#
#   Get the current (released) version of packages that we depend on
#
getCurrentPkgVersion ( $opt_rtagid, $_ ) for (keys %BuildPackages);
#DebugDumpData ("ReleasePackages", \%ReleasePackages );


#
#   %ReleasePackages - Packages in this release
#   %BuildPackages   - Packges in this build
#
foreach my $pkg ( keys %BuildPackages  )
{
    foreach my $ext ( keys %{$BuildPackages{$pkg}}  )
    {
#print "Version: $pkg, $ext, $BuildPackages{$pkg}{$ext} \n";

        Error ("Package not in Release: $pkg") unless ( exists $ReleasePackages{$pkg} );
        Error ("Package not in Release: $pkg.xxx.$ext") unless ( exists $ReleasePackages{$pkg}{$ext} );
#        $ReleasePackages{$pkg}{$ext} =  $BuildPackages{$pkg}{$ext};
    }
}

#
#   Create a configuration file for use by the JATS rewrite tool
#   This will allow the build.pl file to be re-written
#
my $file = "jats_rewrite.cfg";
open CFG, ">$file" || Error("Cannot create $file" );
foreach my $pkg ( sort keys %ReleasePackages )
{
    foreach my $prj ( sort keys %{$ReleasePackages{$pkg}} )
    {
        my $ver = $ReleasePackages{$pkg}{$prj};
        print CFG "${pkg} ${ver}.${prj}\n";
    }
}
close CFG;

#
#   Massage the build.pl file to create the auto.pl file
#   That will be used to create the final package.
#
JatsTool ("jats_rewrite.pl", "-conf", "$file", "-verb" ) && Error("Did not rewrite build.pl file");

exit 0;

#-------------------------------------------------------------------------------
# Function        : getPkgDetailsBy_PVID
#
# Description     :
#
# Inputs          : pvid
#
# Returns         :
#
sub getPkgDetailsBy_PVID
{
    my (@row);
    my ($pv_id) = @_;

    # if we are not or cannot connect then return 0 as we have not found anything
    connectRM(\$RM_DB) unless ( $RM_DB );
#print "getPkgDetailsBy_PVID: $pv_id\n";


    #
    #   Determine package information
    #
    my $m_sqlstr = "SELECT pkg.PKG_NAME, pv.PKG_VERSION, pkg.PKG_ID, pv.PV_ID, pv.CHANGE_TYPE, pv.BUILD_TYPE, pv.PKG_LABEL, pv.SRC_PATH".
                   " FROM RELEASE_MANAGER.PACKAGES pkg, RELEASE_MANAGER.PACKAGE_VERSIONS pv" .
                   " WHERE pv.PV_ID = \'$pv_id\' AND pkg.PKG_ID = pv.PKG_ID";
    my $sth = $RM_DB->prepare($m_sqlstr);
    if ( defined($sth) )
    {
        if ( $sth->execute( ) )
        {
            if ( $sth->rows )
            {
                while ( @row = $sth->fetchrow_array )
                {
#print ( "getPkgDetailsBy_PVID: " . join(',', @row) . "\n");
                    $base_name = $row[0];
                    $base_version = $row[1];
                    $base_label = $row[6];
                    $base_path = $row[7];

                    my ( $pn, $pv, $pp ) = SplitPackage( $base_name, $base_version );
                    $BuildPackages{$pn}{$pp} = $pv;

                    last;
                }
            }
            $sth->finish();
        }
        else
        {
            Error("getPkgDetailsBy_PVID:Execute failure 1", $m_sqlstr );
        }
    }
    else
    {
        Error("getPkgDetailsBy_PVID:Prepare failure" );
    }


    #   Now extract the package dependacies
    #
    $m_sqlstr = "SELECT pkg.PKG_NAME, pv.PKG_VERSION, pd.DPV_ID" .
                   " FROM RELEASE_MANAGER.PACKAGE_DEPENDENCIES pd, RELEASE_MANAGER.PACKAGE_VERSIONS pv, RELEASE_MANAGER.PACKAGES pkg" .
                   " WHERE pd.PV_ID = \'$pv_id\' AND pd.DPV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID";
    $sth = $RM_DB->prepare($m_sqlstr);
    if ( defined($sth) )
    {
        if ( $sth->execute( ) )
        {
            if ( $sth->rows )
            {
                while ( @row = $sth->fetchrow_array )
                {
#print ( "getPkgDetailsBy_PVID: " . join(',', @row) . "\n");
                    my ( $pn, $pv, $pp ) = SplitPackage( $row[0], $row[1] );
                    $BuildPackages{$pn}{$pp} = $pv;
                }
            }
            $sth->finish();
        }
        else
        {
            Error("getPkgDetailsBy_PVID:Execute failure 2", $m_sqlstr );
        }
    }
    else
    {
        Error("getPkgDetailsBy_PVID:Prepare failure" );
    }
}

#-------------------------------------------------------------------------------
# Function        : getCurrentPkgVersion
#
# Description     : 
#
# Inputs          : 
#
# Returns         : 
#
sub getCurrentPkgVersion
{

    my ($RTAG_ID, $pname ) = @_;
    my $foundDetails = 0;
    my (@row);

    # if we are not or cannot connect then return 0 as we have not found anything
    connectRM(\$RM_DB)
        unless ( $RM_DB );

    # First get details from pv_id

    my $m_sqlstr = "SELECT pv.PV_ID, pkg.PKG_NAME, pv.PKG_VERSION" .
                   " FROM RELEASE_MANAGER.RELEASE_CONTENT rc, RELEASE_MANAGER.PACKAGE_VERSIONS pv, RELEASE_MANAGER.PACKAGES pkg" .
                   " WHERE rc.RTAG_ID = $RTAG_ID AND rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID AND pkg.PKG_NAME = \'$pname\'";
    my $sth = $RM_DB->prepare($m_sqlstr);
    if ( defined($sth) )
    {
        if ( $sth->execute( ) )
        {
            if ( $sth->rows )
            {
                while ( @row = $sth->fetchrow_array )
                {
#print ( "getCurrentPkgVersion: " . join(',', @row) . "\n");
                    my $pv_id   = $row[0];
                    my $name    = $row[1];
                    my $version = $row[2];

                    my ( $pn, $pv, $pp ) = SplitPackage( $name,  $version );
                    $ReleasePackages{$pn}{$pp} = $pv;
                }
            }
            $sth->finish();
        }
        else
        {
            Error("getCurrentPkgVersion:Execute failure" );
        }
    }
    else
    {
        Error("getCurrentPkgVersion:Prepare failure" );
    }
}
