#------------------------------------------------------------
# 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 RPS::RoyaltyRun::Status;

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}   = Common::FormObject::Scalar->new( value => $prop->{running},   id => RPS::RoyaltyRun::Status::kRunning );
    $self->{Complete}  = Common::FormObject::Scalar->new( value => $prop->{complete},  id => RPS::RoyaltyRun::Status::kComplete );
    $self->{Committed} = Common::FormObject::Scalar->new( value => $prop->{committed}, id => RPS::RoyaltyRun::Status::kCommitted );
    $self->{Aborted}   = Common::FormObject::Scalar->new( value => $prop->{aborted},   id => RPS::RoyaltyRun::Status::kAborted );
    $self->{Error}     = Common::FormObject::Scalar->new( value => $prop->{error},     id => RPS::RoyaltyRun::Status::kError );
    $self->{Closed}    = Common::FormObject::Scalar->new( value => $prop->{closed},    id => RPS::RoyaltyRun::Status::kClosed );
    $self->{WaitingToRun} =
      Common::FormObject::Scalar->new( value => $prop->{waiting_to_run}, id => RPS::RoyaltyRun::Status::kWaitingToRun );
    $self->{WaitingToCommit} =
      Common::FormObject::Scalar->new( value => $prop->{waiting_to_commit}, id => RPS::RoyaltyRun::Status::kWaitingToCommit );
    $self->{WaitingToDelete} =
      Common::FormObject::Scalar->new( value => $prop->{waiting_to_delete}, id => RPS::RoyaltyRun::Status::kWaitingToDelete );
    $self->{Invalidated} = Common::FormObject::Scalar->new( value => $prop->{invalidated}, id => RPS::RoyaltyRun::Status::kInvalidated );

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