#------------------------------------------------------------
# Copyright (C) 2009 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package Distribution::DistributionProcess::DistributionProcessWithStatus;

use strict;
use warnings;

use lib '/app/tools/rps/lib';

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

use Data::Dumper;

use lib '/app/tools/rps/lib';
use RPS::Product::ProductDistributionList;

use lib '/app/tools/distribution/lib';
use Distribution::DistributionProcess::DistributionJobList;
use Distribution::DB::Item::Job;

use Distribution::Job::Packager;
use Distribution::Job::Delivery;

use base 'Distribution::DistributionProcess';

sub _propertiesFromDBItem {
    my ( $self, $hrProperties, $dbItem ) = @_;

    $hrProperties->{distribution_process_id} = $dbItem->distribution_process_id;
    $hrProperties->{client_id}               = $dbItem->{client_id};

    $hrProperties->{start_date} = $dbItem->{start_date};
    $hrProperties->{end_date}   = $dbItem->{end_date};
    $hrProperties->{queue_date} = $dbItem->{queue_date};
    $hrProperties->{status}     = $dbItem->{status};
    $hrProperties->{exit_code}  = $dbItem->{exit_code};

    $hrProperties->{service} = $dbItem->{service};

}

sub _initProperties {
    my ( $self, $props ) = @_;

    $self->{DistributionProcessID} = Common::FormObject::Scalar->new( value => $props->{distribution_process_id}, readOnly => 1 );
    $self->{Status}                = $props->{status};
    $self->{ClientID}              = $props->{client_id};
    $self->{Service}               = $props->{service} || $self->Service();
    $self->{Delivering}            = $self->Delivering();
    $self->{State}                 = $props->{status} || $self->State();
    $self->{QueueDate}             = $props->{queue_date} || $self->QueueDate();
    $self->{EndDate}               = $props->{end_date} || $self->EndDate();
    $self->{StartDate}             = $props->{start_date} || $self->StartDate();

    $self->{JobCount} = Distribution::DB::Item::DistributionJob->getJobCount( $props->{distribution_process_id}, $props->{client_id} );
}

sub Service {
    my $self = shift;
    assert($self);

    return unless ( $self->{ClientID} );

    return Distribution::DB::Item::DistributionProcess->LookupServiceByJob( $self->DistributionProcessID, $self->{ClientID} );
}

sub requeueLastJob {
    my $self = shift;
    assert($self);

    assert( $self->{ClientID} );
    assert( $self->{DistributionProcessID} );

    my $dbJob = Distribution::DB::Item::Job->GetLastDistributionJob(
        clientID              => $self->{ClientID},
        distributionProcessID => $self->DistributionProcessID
    );
    assert($dbJob);
    my $jobObj = Job::Job->CreateFromDBItem($dbJob);

    # Hack to support jobs that just use command line
    if ( ref($jobObj) eq 'Job::Job' ) {
        if ( $jobObj->{Class} eq 'Packager' ) {
            $jobObj = Distribution::Job::Packager->CreateFromDBItem($dbJob);
        } elsif ( $jobObj->{Class} eq 'Delivery' ) {
            $jobObj = Distribution::Job::Delivery->CreateFromDBItem($dbJob);
        }
    }

    # Invoke the 'copy constructor' to create a new job with the same command-line settings as the old one,
    # then put it on the queue.
    #
    my $newJob = Job::Job->Copy($jobObj);
    $newJob->enqueue( distProcessID => $self->DistributionProcessID );
}

1;
