#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::Statement::Mechanical::BaseStatement;
use strict;
use warnings;

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

use Common::FormObject;
use base 'Common::FormObject';

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

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

    my %properties;
    if ( $args{_dbItem} ) {
        $self->_propertiesFromDBItem( \%properties, $args{_dbItem} );
    } elsif ( $args{mechanicalStatementID} ) {
        $self->_propertiesFromDB( \%properties, $args{mechanicalStatementID} );
    } else {
        $self->_propertiesFromDefaults( \%properties );
    }
    $self->_initProperties( \%properties, $args{skipTransactionsList} );

    return $self;
}

sub _propertiesFromDB {
    my ( $self, $hrProperties, $id ) = @_;
    assert( 0, 'override this' );
}

sub _propertiesFromDBItem {
    my ( $self, $hrProperties, $dbItem ) = @_;
    assert( 0, 'override this' );
}

sub _getCurrencyCode {
    assert( 0, 'override this' );
}

sub _getPublisher {
    my ( $self, $publisherID ) = @_;
    assert( 0, 'override this' );
}

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

    # !!! Eventually we're going to want to use the Publisher's currency code, but for
    # !!! now we'll assume USD.
    my $currencyCode = $self->_getCurrencyCode();

    $self->{MechanicalStatementID} = Common::FormObject::Scalar->new(
        value    => $props->{mechanical_statement_id},
        readOnly => 1
    );
    $self->{MechanicalRunID} = Common::FormObject::Scalar->new(
        value    => $props->{mechanical_run_id},
        readOnly => 1
    );
    $self->{PublisherID} = Common::FormObject::Scalar->new(
        value => $props->{publisher_id}
    );
    $self->{PayorID} = Common::FormObject::Scalar->new(
        value => $props->{payor_id}
    );
    $self->{StartDate} = Common::FormObject::Scalar::Date->new(
        value    => $props->{start_date},
        readOnly => 1
    );
    $self->{EndDate} = Common::FormObject::Scalar::Date->new(
        value    => $props->{end_date},
        readOnly => 1
    );
    $self->{Status} = Common::FormObject::Scalar->new(
        value => $props->{status}
    );
    $self->{PreviousAdvanceBalance} = Common::FormObject::Scalar::Money->new(
        value        => ( -1 * $props->{previous_advance_balance} ),
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{PreviousBalance} = Common::FormObject::Scalar::Money->new(
        value        => $props->{previous_balance},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{Subtotal} = Common::FormObject::Scalar::Money->new(
        value        => $props->{subtotal},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{TransactionSubtotal} = Common::FormObject::Scalar::Money->new(
        value        => $props->{transaction_subtotal},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{StatementTotal} = Common::FormObject::Scalar::Money->new(
        value        => $props->{statement_total},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{AmountDue} = Common::FormObject::Scalar::Money->new(
        value        => $props->{amount_due},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{AdvanceBalance} = Common::FormObject::Scalar::Money->new(
        value        => ( -1 * $props->{advance_balance} ),
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{Balance} = Common::FormObject::Scalar::Money->new(
        value        => $props->{balance},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{AppliedToAdvance} = Common::FormObject::Scalar::Money->new(
        value        => $props->{applied_to_advance},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{AppliedToBalance} = Common::FormObject::Scalar::Money->new(
        value        => $props->{applied_to_balance},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{DateCreated} = Common::FormObject::Scalar::DateTime->new(
        value    => $props->{date_created},
        readOnly => 1
    );
    $self->{DateModified} = Common::FormObject::Scalar::DateTime->new(
        value    => $props->{date_modified},
        readOnly => 1
    );
    $self->{CreatedBy} = Common::FormObject::Scalar::UserName->new(
        value    => $props->{created_by},
        readOnly => 1
    );
    $self->{ModifiedBy} = Common::FormObject::Scalar::UserName->new(
        value    => $props->{modified_by},
        readOnly => 1
    );
    $self->{PhysicalSubtotal} = Common::FormObject::Scalar::Money->new(
        value        => $props->{physical_subtotal},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{DigitalSubtotal} = Common::FormObject::Scalar::Money->new(
        value        => $props->{digital_subtotal},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{MinimumPayment} = Common::FormObject::Scalar::Money->new(
        value        => $props->{min_payment},
        precision    => '.4',
        currencyCode => $currencyCode
    );
    $self->{OnHold} = Common::FormObject::Scalar::Boolean->new(
        value    => $props->{on_hold},
        readOnly => 1
    );
    $self->{Version} = Common::FormObject::Scalar->new(
        value    => $props->{version},
        readOnly => 1
    );
    $self->{DateSent} = Common::FormObject::Scalar::Date->new(
        value => $props->{date_sent}
    );

    # Have to fetch publisher info to finish these calculations...
    # !!! This can probably go away if we just capture all the pub data we need in the statement table...
    $self->{Publisher} = $self->_getPublisher( $props->{publisher_id} );

}

sub _propertiesFromDefaults {
    my ( $self, $hrProperties ) = @_;
}


1;
