#!/usr/bin/perl
use strict;

use Data::Dumper;
use Getopt::Std;
use POSIX qw(ceil);
use POSIX ":sys_wait_h";
use Sys::Hostname;
use Carp;

use lib '/app/tools/common/lib';
use Common::DB::Item;
use Common::Assert;
use Common::TextProgressBar;
use Common::Timer;
use Common::DB::Item::Service;
use Common::RSMath;

#use lib '/app/tools/data_classes/lib';
#use File::Sale;
use lib '/app/tools/raptor/lib';

#use Raptor::Sale::Sale;
use Raptor::DB::Item::Sale;
use Raptor::DB::Item::File;

use lib '/app/tools/rps/lib';
use RPS::Mechanical::MechanicalRun;
use RPS::DB::Item::MechanicalRun;
use RPS::DB::Item::Product;
use RPS::DB::Item::Publisher;
use RPS::DB::Item::PublisherAccount;
use RPS::DB::Item::Track;
use RPS::DB::Item::TrackLicense;
use RPS::DB::Item::LicenseReserve;
use RPS::DB::Item::LicenseReserveRun;
use RPS::DB::Item::ReserveLiquidation;
use RPS::DB::Item::PendingTransaction;
use RPS::DB::Item::MechanicalStatement;
use RPS::DB::Item::MechanicalStatementTransaction;
use RPS::DB::Item::MechanicalStatementItem;
use RPS::DB::Item::MechanicalCarryover;
use RPS::DB::Item::MechanicalStatementLicense;
use RPS::DB::Item::SaleMechanicalStatementItemMap;
use RPS::DB::Item::FinanceAccount;
use RPS::DB::Item::FinanceTransaction;

my $gVerbosityLevel = 1;

# Parse the command-line options.
#
my %options;
_parseCommandLine( \%options );

# Instantiate the application singleton object.
#
my $appSingleton = Common::RSApp->new( clientID => 31 );

my $db = Common::RSApp::GetClientDB();

my @runList = ( 44, 47, 51 );

foreach my $runID (@runList) {
    _populateCarryover($runID);
}

sub _populateCarryover {
    my ($runID) = @_;

    # Create carryover table entries.
    #
    # Don't need to create entries in the 'mechanical_statement_carryover' table.
    # That table will be populated when we run mechanicals, and entries removed
    # when runs are committed.
    #
    my $statements = RPS::DB::Item::MechanicalStatement::GetByMechanicalRunID($runID);

    while ( $statements->hasNext() ) {
        my $statement = $statements->next();
        _handleCarryover($statement);
    }

}

sub _handleCarryover {
    my ($statement) = @_;

    my $statementItems = RPS::DB::Item::MechanicalStatementItem::GetByMechanicalStatementID( $statement->mechanical_statement_id );
    while ( my $item = $statementItems->next() ) {
        if ( $item->carryover ) {

            my $newCarryover = RPS::DB::Item::MechanicalCarryover->Create(
                track_license_id   => $item->track_license_id,
                sale_stat_rate_id  => $item->sale_stat_rate_id,
                issue_stat_rate_id => $item->issue_stat_rate_id,
                product_id         => $item->product_id,
                units              => $item->carryover,
            );

            $newCarryover->save();
            _report(
                "   created carryover: "
                  . $newCarryover->mechanical_carryover_id . " "
                  . $item->track_license_id . " "
                  . $item->sale_stat_rate_id . " "
                  . $item->issue_stat_rate_id . " "
                  . $item->product_id . " "
                  . $item->carryover,
                2
            );
        }
    }
}

sub _usage {
    print "\nusage: $0 -c client_id [-V]\n";
    print "\n";
    print "Arguments:\n";
    print "\t-c <client_id>\t\tThe client_id of the client to process\n";
    print "\t-V <N>\t\t\tVerbosity level - 0 means no output\n";
}

sub _report {
    my ( $string, $verbosity ) = @_;
    $verbosity = 1 unless defined $verbosity;

    if ( $gVerbosityLevel >= $verbosity ) {
        print $string . "\n";
    }
}

# Pass dates in 'yyyy-mm-dd' format.
#
sub _parseCommandLine {
    my ($settings) = @_;

    my %opt;
    getopts( 'V:', \%opt );

    if ( defined $opt{V} ) {
        $gVerbosityLevel = $opt{V};
    }
}

