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

use Carp;
use strict;
use warnings;

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

use lib '/app/tools/rps/lib';
use RPS::Finance::Account;

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

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

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

    my %properties;

    # jpk - We need a way to pass some filtering arguments through to the finance account.
    # I guess for now we'll just carry these along.
    #
    $self->{_showPendingPaymentsOnly} = $args{showPendingPaymentsOnly};

    if ( $args{_dbItem} ) {
        $self->_propertiesFromDBItem( \%properties, $args{_dbItem} );
    } elsif ( $args{publisherID} && $args{payorID} && $args{indirectPublisherID} ) {
        $self->_propertiesFromDB( \%properties, $args{publisherID}, $args{payorID}, $args{indirectPublisherID} );
    } else {
        $self->_propertiesFromDefaults( \%properties, $args{publisherID}, $args{payorID}, $args{indirectPublisherID} );
    }

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

    return $self;
}

sub _propertiesFromDB {
    my ( $self, $hrProperties, $publisherID, $payorID, $indirectPublisherID ) = @_;

    my $dbItem = $self->_publisherAccount()
      ->Lookup( $self->_publisherID() => $publisherID, payor_id => $payorID, indirect_publisher_id => $indirectPublisherID );

    if ($dbItem) {
        $self->_propertiesFromDBItem( $hrProperties, $dbItem );
    } else {
        $self->_propertiesFromDefaults( $hrProperties, $publisherID, $payorID, $indirectPublisherID );
    }
}

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

    $self->{_dbItem} = $dbItem;

    my $publisherID = $self->_publisherID();
    $hrProperties->{$publisherID}          = $dbItem->$publisherID;
    $hrProperties->{payor_id}              = $dbItem->payor_id;
    $hrProperties->{indirect_publisher_id} = $dbItem->indirect_publisher_id;
    $hrProperties->{finance_account_id}    = $dbItem->finance_account_id;
}

sub _propertiesFromDefaults {
    my ( $self, $hrProperties, $publisherID, $payorID, $indirectPublisherID ) = @_;

    $hrProperties->{ $self->_publisherID() } = $publisherID         if $publisherID;
    $hrProperties->{payor_id}                = $payorID             if $payorID;
    $hrProperties->{indirect_publisher_id}   = $indirectPublisherID if $indirectPublisherID;
}

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

    $self->{PublisherID}         = Common::FormObject::Scalar->new( value => $props->{ $self->_publisherID() }, readOnly => 1 );
    $self->{PayorID}             = Common::FormObject::Scalar->new( value => $props->{payor_id},                readOnly => 1 );
    $self->{IndirectPublisherID} = Common::FormObject::Scalar->new( value => $props->{indirect_publisher_id},   readOnly => 1 );
    $self->{FinanceAccountID}    = Common::FormObject::Scalar->new( value => $props->{finance_account_id},      readOnly => 1 );
    $self->{MinPayment} = Common::FormObject::Scalar::Decimal->new( value => $props->{min_payment}, precision => '0.2' );
}

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

    if ( $self->loadSubs() ) {
        if ( $props->{finance_account_id} ) {
            $self->{FinanceAccount} = RPS::Finance::Account->new(
                accountID               => $props->{finance_account_id},
                showPendingPaymentsOnly => $self->{_showPendingPaymentsOnly},
            );
        } else {
            $self->{FinanceAccount} = RPS::Finance::Account->new();
            $self->{FinanceAccount}->CurrencyCode( $self->_publisherCurrency() );
        }
    }
}

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

    if ( !$self->{FinanceAccount}->Description() ) {
        $self->{FinanceAccount}->Description( "account for publisher "
              . $self->PublisherID()
              . " payor "
              . $self->PayorID()
              . " indirect publisher "
              . $self->IndirectPublisherID() );
    }
    if ( !$self->{FinanceAccount}->TypeCode() ) {
        $self->{FinanceAccount}->TypeCode(RPS::DB::Item::FinanceAccount::kAccountTypeHoldover);
    }

    $self->{FinanceAccount}->save();
    my $financeAccountID = $self->{FinanceAccount}->AccountID();

    $dbItem = $self->{_dbItem} unless $dbItem;

    if ( !$dbItem ) {
        $dbItem = $self->_publisherAccount()->Create();
    }

    if ( $dbItem->finance_account_id() != $financeAccountID ) {
        $dbItem->finance_account_id($financeAccountID);
    }

    my $publisherID = $self->_publisherID();

    $dbItem->$publisherID( $self->PublisherID() );
    $dbItem->payor_id( $self->PayorID() );
    $dbItem->indirect_publisher_id( $self->IndirectPublisherID() );

    $dbItem->save();

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

sub clearPayments {
    my ($self) = @_;

    $self->{FinanceAccount}->clearPendingPayments();
}

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

    $self->{FinanceAccount}->setFirstPendingPayment($amount);
}

###
1;    #
###

