#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::Track::TrackContractAdvance;

use Carp;
use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::TrackContractAdvance;
use RPS::DB::Item::TrackContract;
use RPS::Track::TrackSimple;

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{trackContractAdvanceID} ) {
        $self->_propertiesFromDB( \%properties, $args{trackContractAdvanceID} );
    } elsif ( $args{trackContractID} ) {
        $self->_propertiesFromDefaults( \%properties, $args{trackContractID} );
    } else {

        # oops!
        assert(0);
    }

    $self->_initProperties( \%properties );
    $self->_initSubs( \%properties );

    return $self;
}

sub _propertiesFromDB {
    my ( $self, $hrProperties, $trackContractAdvanceID ) = @_;

    my $dbItem = RPS::DB::Item::TrackContractAdvance->Lookup( track_contract_advance_id => $trackContractAdvanceID );

    $self->_propertiesFromDBItem( $hrProperties, $dbItem );
}

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

    $hrProperties->{track_contract_advance_id} = $dbItem->track_contract_advance_id;
    $hrProperties->{track_contract_id}         = $dbItem->track_contract_id;
    $hrProperties->{advance_account_id}        = $dbItem->advance_account_id;
    $hrProperties->{cross_collateralized}      = $dbItem->cross_collateralized;
}

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

    $hrProperties->{track_contract_id} = $trackContractID;
}

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

    $self->{TrackContractAdvanceID} = Common::FormObject::Scalar->new( value => $props->{track_contract_advance_id}, readOnly => 1 );
    $self->{TrackContractID}        = Common::FormObject::Scalar->new( value => $props->{track_contract_id},         readOnly => 1 );
    $self->{AdvanceAccountID}       = Common::FormObject::Scalar->new( value => $props->{advance_account_id},        required => 1 );
    $self->{CrossCollateralized} = Common::FormObject::Scalar::Boolean->new( value => $props->{cross_collateralized} );
}

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

    if ( $self->loadSubs() ) {
        if ( $props->{advance_account_id} ) {
            $self->{AdvanceAccount} = RPS::Finance::Account->new( accountID => $props->{advance_account_id}, readOnly => 1 );
        } else {
            $self->{AdvanceAccount} = RPS::Finance::Account->new( readOnly => 1 );
        }
    }
}

sub addAdvance {
    my ( $self, $amount, $memo ) = @_;

    my $dbItem;
    my $accountID;
    if ( $self->TrackContractAdvanceID() ) {
        $dbItem = RPS::DB::Item::TrackContractAdvance->Lookup( track_contract_advance_id => $self->TrackContractAdvanceID() );
        $accountID = $dbItem->advance_account_id;
    } else {
        $dbItem = RPS::DB::Item::TrackContractAdvance->Create();
    }

    if ( !$accountID ) {

        # create a new account
        #
        my $account = RPS::DB::Item::FinanceAccount->Create(
            description => "advance account for track contract",
            type_code   => RPS::DB::Item::FinanceAccount::kAccountTypeAdvance(),
        );
        $account->save();
        $accountID = $account->finance_account_id;

        # Remember the new account id
        #
        $dbItem->advance_account_id($accountID);
    }

    # Create a transaction
    #
    if ($amount) {
        if ( !$memo ) {
            $memo = "track contract advance account transaction";
        }

        my $transaction = RPS::DB::Item::FinanceTransaction->Create(
            finance_account_id => $accountID,
            amount             => $amount,
            type_code          => RPS::DB::Item::FinanceTransaction::kTypeAdjustment(),
            memo               => $memo,
        );
        $transaction->save();
    }

    $self->save($dbItem);
}

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

    # -------------------------------
    # Save myself (TrackContractAdvance)
    # -------------------------------
    #
    if ( !$dbItem ) {
        if ( $self->TrackContractAdvanceID() ) {
            $dbItem = RPS::DB::Item::TrackContractAdvance->Lookup( track_contract_advance_id => $self->TrackContractAdvanceID() );
        } else {
            $dbItem = RPS::DB::Item::TrackContractAdvance->Create();
        }
    }

    $dbItem->track_contract_id( $self->TrackContractID() );
    $dbItem->cross_collateralized( $self->CrossCollateralized() );

    $dbItem->save();

    # reload object state
    #
    $self->_init( _dbItem => $dbItem );
}

###
1;    #
###

