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

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

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

    return $self;
}


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

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

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


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

    $self->{_dbItem} = $dbItem;

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


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

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


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->{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());
    }
    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->min_payment($self->MinPayment());

	$dbItem->save();

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


sub clearPayments
{
    my ($self) = @_;
    
    $self->{FinanceAccount}->clearPendingPayments();
}


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

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


###
1;#
###


