#------------------------------------------------------------
# Copyright (C) 2009 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::RoyaltyRun::RoyaltyRunStatus;

use strict;
use warnings;
use Carp;

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

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

use base 'Common::FormObject';


sub _databaseClass { assert( 0, "Must be overloaded" ) }
sub _statusCountMethod { 'GetRunStatusCounts' }

sub _init
{
    my $self = shift;
	my %args = @_;

	$self->_initFromDB( payorID => $args{payorID} );

	$self->{PayorID} = $args{payorID} if( $args{payorID} );

	return $self;
}


sub validate {
	my $self = shift;

	return $self->canEdit();
}

sub _initFromDB {
	my $self = shift;
	my %args = @_;

	my $dbClass = $self->_databaseClass();
	my $method  = $self->_statusCountMethod();

	eval "require " . $dbClass;

    die $@ if( $@ );

	assert( $dbClass->can( $method ), "DB Lookup Method '$method' doesn't exist in $dbClass" );

    return $self->_initFromDBItem( $dbClass->$method( %args ) );
}

sub _initFromDBItem {
	my $self = shift;
	my $dbItem = shift;

    my %properties =
    (
		running            => $dbItem->_running,
		complete           => $dbItem->_complete,
		committed          => $dbItem->_committed,
		aborted            => $dbItem->_aborted,
		error              => $dbItem->_error,
		closed             => $dbItem->_closed,
		waiting_to_run     => $dbItem->_waiting_to_run,
		waiting_to_commit  => $dbItem->_waiting_to_commit,
		waiting_to_delete  => $dbItem->_waiting_to_delete,
		invalidated        => $dbItem->_invalidated,
    );

	return $self->_initProperties(\%properties);
}

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

	$self->{Running}         = $prop->{running};
	$self->{Complete}        = $prop->{complete};
	$self->{Committed}       = $prop->{committed};
	$self->{Aborted}         = $prop->{aborted};
	$self->{Error}           = $prop->{error};
	$self->{Closed}          = $prop->{closed};
	$self->{WaitingToRun}    = $prop->{waiting_to_run};
	$self->{WaitingToCommit} = $prop->{waiting_to_commit};
	$self->{WaitingToDelete} = $prop->{waiting_to_delete};
	$self->{Invalidated}     = $prop->{invalidated};

    $self->{CanEdit}     = $self->canEdit();
    $self->{HasOpenRuns} = $self->hasOpenRuns();

    return $self;
}

sub hasOpenRuns {
	my $self = shift;

	return ( $self->Running      ||
	         $self->Complete     ||
		     $self->WaitingToRun ||
		     $self->WaitingToCommit ) ? 1 : 0;
}

sub canEdit {
	my $self = shift;
    return $self->hasOpenRuns() ? 0 : 1;
}

1;
