#!/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 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::DB::Item::TrackLicense;
use RPS::DB::Item::Track;
use RPS::DB::Item::Master;

#use RPS::DB::Item::License;
use RPS::DB::Item::LicenseReserve;
use RPS::DB::Item::StatRate;
use RPS::DB::Item::ProductTrack;
use RPS::DB::Item::Song;

use RPS::DB::Item::Publisher;

#use RPS::DB::Item::ControlledComposition;

use RPS::DB::Item::MechanicalRun;
use RPS::DB::Item::MechanicalStatement;
use RPS::DB::Item::MechanicalStatementItem;
use RPS::DB::Item::MechanicalStatementPublisher;
use RPS::DB::Item::MechanicalStatementTrack;
use RPS::DB::Item::MechanicalStatementLicense;
use RPS::DB::Item::MechanicalStatementAdjustmentItem;
use RPS::DB::Item::SaleMechanicalStatementItemMap;

use RPS::License::TrackLicense;
use RPS::License::TrackLicenseList;

use RPS::Statement::Mechanical::StatementDisplay;
use RPS::XMLCache;

$SIG{__WARN__} = sub { };

my $gVerbosityLevel = 1;

my %options;
_parseCommandLine( \%options );
_populateCache( $options{clientID}, $options{runID} );

sub _populateCache {
    my ( $clientID, $id ) = @_;

    #    Common::Timer::Start();
    my $timer = Common::Timer->new();

    my $appSingleton = Common::RSApp->new( clientID => $clientID );

    print "populating XML Cache : " . localtime() . "\n";

    # Get the statements associated with this run.
    #
    my $statementList = RPS::DB::Item::MechanicalStatement->GetByMechanicalRunID($id);
    while ( $statementList->hasNext() ) {
        my $statement   = $statementList->next();
        my $statementID = $statement->mechanical_statement_id;

        my $publisher = RPS::DB::Item::Publisher->Lookup( publisher_id => $statement->publisher_id );
        my $pubNameLC = lc( $publisher->publisher_name );
        next unless $pubNameLC =~ /harry fox/;

        #        next unless ('harry fox agency' eq lc($publisher->publisher_name));
        #next unless (1 == $publisher->publisher_id);

        print "   populating cache for statement $statementID\n";

        my $statementXML = RPS::Statement::Mechanical::StatementDisplay->new( mechanicalStatementID => $statementID );
        RPS::XMLCache::Store( $statementXML, 'RPS', 'Statement', 'Command', 'ShowMechanical', $statementID );

        # Cache the hfa statement if this publisher is an agent.
        #
        if ( $publisher->is_agency || $publisher->is_admin ) {
            print "   publisher is admin/agent, populating additional files\n";

# Get a list of all the publisher ids that appear on this statement.
#
#            my $publisherItems = RPS::DB::Item::MechanicalStatementPublisher->GetByMechanicalStatementID($statementID);
#            while (my $pubItem = $publisherItems->next())
#            {
#                my $focusID = $pubItem->publisher_id;
#                $statementXML = RPS::Statement::Mechanical::StatementDisplay->new(mechanicalStatementID => $statementID,
#                 focusPublisherID => $focusID);
#                RPS::XMLCache::Store($statementXML, 'RPS','Statement','Command','ShowMechanical_focusPublisherID_' . $focusID, $statementID);
#            }
#
#
            $statementXML = RPS::Statement::Mechanical::StatementDisplay->new( mechanicalStatementID => $statementID, hfa => 1 );
            RPS::XMLCache::Store( $statementXML, 'RPS', 'Statement', 'Command', 'ShowMechanical_hfa', $statementID );
        }
    }
    print "finished : " . localtime() . "\n";

    #    Common::Timer::Stop();
    #    Common::Timer::Report(*STDOUT);
}

sub _parseCommandLine {
    my ($settings) = @_;

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

    if ( !$opt{c} ) {
        _usage();
        exit(1);
    }

    if ( !$opt{r} ) {

        # Want to display a list of possible runs, then the usage message.
        #
        _listAvailableRunIDs( $opt{c} );
        _usage();
        exit(1);
    }

    $settings->{runID}    = $opt{r};
    $settings->{clientID} = $opt{c};
    if ( $opt{V} ) {
        $gVerbosityLevel = $opt{V};
    }
}

sub _usage {
    print "\nusage: $0 -c client_id -r run_id\n";
    print "\n";
    print "Arguments:\n";
    print "\t-c <client_id>\t\tThe client_id of the client to process\n";
    print "\t-r <run_id>\t\tThe mechanical_run_id of the run to cache\n";
}

sub _listAvailableRunIDs {
    my ($clientID) = @_;

    my $appSingleton = Common::RSApp->new( clientID => $clientID );

    print "\nValid run ids:\nrun id\tstart date\tend date\tstatus\n\n";

    my $runList = RPS::DB::Item::MechanicalRun->GetAll();
    while ( my $run = $runList->next() ) {
        print $run->mechanical_run_id . "\t" . $run->start_date . "\t" . $run->end_date . "\t" . $run->status . "\n";
    }
}

