#!/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";
    }
}

