#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package Distribution::DeliveryReport;
use strict;
use warnings;

use Date::Simple qw( today );

use lib '/app/tools/common/lib';
use Common::RSApp;
use Common::Util;
use Common::Assert;

use lib '/app/tools/job/lib';
use Job::Job;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::Product;
use RPS::DB::Item::Album;

use lib '/app/tools/distribution/lib';
use Distribution::DB::Item::DistributionService;
use Distribution::DB::Item::ProductDistribution;

use base 'Common::CronScript';

sub _init {
    my ( $self, %args ) = @_;

    $self->{_date} = $args{date} ? Date::Simple->new( $args{date} ) : today() - 1;
    assert( $self->{_date}, "Invalid date format" );

    return $self->SUPER::_init(%args);
}

sub _run_options {
    my $self = shift;

    my $out = $self->SUPER::_run_options();

    return sprintf( "%s\n  Date: %s", $out, $self->{_date} );
}

sub _process() {
    my $self = shift;
    my $successful_deliveries;
    my $delivery_failures;
    my $client_id   = Common::RSApp::GetClientID();
    my $client_name = Common::RSDB::ClientIDToDBName($client_id);

    my $col = Distribution::DB::Item::ProductDistribution->GetDeliveryReport("$self->{_date}");

    while ( $col->hasNext ) {
        my $out = $self->_get_product_report( $col->next );
        $successful_deliveries .= $out if ($out);
    }

    $delivery_failures = $self->_get_delivery_failures();

    if ( $successful_deliveries || $delivery_failures ) {
        $self->print("\nDelivery Summary, $self->{_date}");
        $self->print("  Client DB: $client_name\n");

        if ($successful_deliveries) {
            $self->print("  Successful Deliveries delivered on $self->{_date}\n");
            $self->print("$successful_deliveries\n");
        }

        if ($delivery_failures) {
            $self->print("  Failed Deliveries created on $self->{_date}\n");
            $self->print("$delivery_failures\n");
        }
    }

}

sub _get_product_report {
    my $self         = shift;
    my $product_dist = shift;
    my $report;

    if ($product_dist) {
        my $services = Distribution::DB::Item::DistributionService->GetServiceNames( $product_dist->{services} );
        my $product  = RPS::DB::Item::Product->Lookup( product_id => $product_dist->product_id );
        my $album    = RPS::DB::Item::Album->Lookup( album_id => $product->asset_id );
        $report = sprintf( "  %s '%s'\n     %s\n\n", $product->upc_ean, $album->title, $services );
    }

    return $report;
}

sub _get_delivery_failures {
    my $self = shift;
    my $result;

    my $col = Distribution::DB::Item::ProductDistribution->GetAllRunning("$self->{_date}");

    while ( $col->hasNext ) {
        my $d_job = $col->next;

        next unless ( $d_job->{job_id} );

        my $job = new Job::Job( jobID => $d_job->{job_id} );

        if (   $job->status
            && $job->status !~ /^(IN_Q|DE_Q|RUN )$/
            && !$d_job->delivery_date ) {

            my $services = Distribution::DB::Item::DistributionService->GetServiceNames( $d_job->{services} );
            my $product  = RPS::DB::Item::Product->Lookup( product_id => $d_job->product_id );
            my $album    = RPS::DB::Item::Album->Lookup( album_id => $product->asset_id );

            $result .= sprintf( "  %s '%s'\n     %s\n\n", $product->upc_ean, $album->title, $services );
        }
    }

    return $result;
}

1;
