#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package Distribution::DistributionProcess::DistributionProcessWithJob;

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};
}

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

    $self->{DistributionProcessID} = Common::FormObject::Scalar->new( value => $props->{distribution_process_id}, readOnly => 1 );
    $self->{ClientID}              = $props->{client_id};
    $self->{Service}               = $self->Service();
    $self->{Delivering}            = $self->Delivering();
    $self->{State}                 = $self->State();
    $self->{QueueDate}             = $self->QueueDate();
    $self->{EndDate}               = $self->EndDate();

    $self->{Jobs} = Distribution::DistributionProcess::DistributionJobList->new(
        distributionProcessID => $props->{distribution_process_id},
        clientID              => $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;
