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

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::LabelPayee;
use RPS::DB::Item::LabelPayeeAccount;
use RPS::DB::Item::Payor;
use RPS::Finance::Account;
use RPS::StateList;

use RPS::LabelPayee::LabelPayeeSimple;
use RPS::LabelPayee::LabelPayeeAccount;
use base 'RPS::LabelPayee::LabelPayeeSimple';

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

    # First, call the inherited method to get it's fields.
    #
    $self->SUPER::_propertiesFromDBItem( $hrProperties, $dbItem );

    # $hrProperties->{artist_payee_id}    = $dbItem->artist_payee_id;
    # $hrProperties->{name}               = $dbItem->name;
    $hrProperties->{street_address}   = $dbItem->street_address;
    $hrProperties->{street_address_2} = $dbItem->street_address_2;
    $hrProperties->{street_address_3} = $dbItem->street_address_3;
    $hrProperties->{city}             = $dbItem->city;
    $hrProperties->{state_province}   = $dbItem->state_province;
    $hrProperties->{country_code}     = $dbItem->country_code;
    $hrProperties->{postal_code}      = $dbItem->postal_code;
    $hrProperties->{email}            = $dbItem->email;
    $hrProperties->{phone_number}     = $dbItem->phone_number;
    $hrProperties->{fax_number}       = $dbItem->fax_number;
    $hrProperties->{tax_id}           = $dbItem->tax_id;
    $hrProperties->{cycle_code}       = $dbItem->cycle_code;

    #	$hrProperties->{min_payment}        = $dbItem->min_payment;
    $hrProperties->{begin_month_code} = $dbItem->begin_month_code;
    $hrProperties->{comments}         = $dbItem->comments;

    #    $hrProperties->{finance_account_id} = $dbItem->finance_account_id;
    #    $hrProperties->{opening_balance}    = $dbItem->opening_balance;

    $hrProperties->{client_payee_id} = $dbItem->client_payee_id;
    $hrProperties->{status}          = $dbItem->status;

    $hrProperties->{date_created}  = $dbItem->date_created;
    $hrProperties->{date_modified} = $dbItem->date_modified;
    $hrProperties->{created_by}    = $dbItem->created_by;
    $hrProperties->{modified_by}   = $dbItem->modified_by;
}

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

    # Call the inherited method first, to let it get the first crack at this.
    #
    $self->SUPER::_initProperties($props);

    # $self->{ArtistPayeeID}      = Common::FormObject::Scalar::Integer->new(value => $props->{artist_payee_id}, readOnly => 1);
    # $self->{Name}               = Common::FormObject::Scalar::String->new(value => $props->{name}, required => 1);
    $self->{StreetAddress}  = Common::FormObject::Scalar::String->new( value => $props->{street_address} );
    $self->{StreetAddress2} = Common::FormObject::Scalar::String->new( value => $props->{street_address_2} );
    $self->{StreetAddress3} = Common::FormObject::Scalar::String->new( value => $props->{street_address_3} );
    $self->{City}           = Common::FormObject::Scalar::String->new( value => $props->{city}, maxlength => 80 );
    $self->{StateProvince}  = Common::FormObject::Scalar::String->new( value => $props->{state_province}, maxlength => 80 );
    $self->{CountryCode}    = Common::FormObject::Scalar::String->new( value => $props->{country_code}, maxlength => 2 );
    $self->{PostalCode}     = Common::FormObject::Scalar::String->new( value => $props->{postal_code}, maxlength => 15 );
    $self->{Email} = Common::FormObject::Scalar::EmailAddress->new( value => $props->{email}, maxlength => 80 );
    $self->{PhoneNumber} = Common::FormObject::Scalar::String->new( value => $props->{phone_number}, maxlength => 30 );
    $self->{FaxNumber}   = Common::FormObject::Scalar::String->new( value => $props->{fax_number},   maxlength => 30 );
    $self->{TaxID}       = Common::FormObject::Scalar::String->new( value => $props->{tax_id},       maxlength => 30 );
    $self->{CycleCode} = Common::FormObject::Scalar->new( value => $props->{cycle_code} );

    #	$self->{MinPayment}         = Common::FormObject::Scalar::Decimal->new(value => $props->{min_payment});
    $self->{BeginMonthCode} = Common::FormObject::Scalar->new( value => $props->{begin_month_code} );
    $self->{Comments} = Common::FormObject::Scalar::String->new( value => $props->{comments}, maxlength => 0 );

    #    $self->{FinanceAccountID}   = Common::FormObject::Scalar::Integer->new(value => $props->{finance_account_id}, readOnly => 1);
    #    $self->{OpeningBalance}     = Common::FormObject::Scalar::Decimal->new(value => $props->{opening_balance});

    $self->{ClientPayeeID} = Common::FormObject::Scalar::String->new( value => $props->{client_payee_id} );
    $self->{Status} = Common::FormObject::Scalar->new( value => $props->{status} );

    $self->{CreatedDate}  = Common::FormObject::Scalar::DateTime->new( value => $props->{date_created},  readOnly => 1 );
    $self->{ModifiedDate} = 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 );
}

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

    if ( $self->loadSubs() ) {

        # Account information (including current balance) will be held in a seperate class.
        #
        #	    $self->{Account} = RPS::Finance::Account->new(accountID => $props->{finance_account_id});
        my $labelPayeeID = $self->LabelPayeeID();
        if ($labelPayeeID) {
            my $accounts = RPS::DB::Item::LabelPayeeAccount->GetByLabelPayeeID($labelPayeeID);
            while ( my $account = $accounts->next() ) {
                push @{ $self->{Account} }, RPS::LabelPayee::LabelPayeeAccount->new( _dbItem => $account, readOnly => 1 );
            }
        }
    }
}

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

    my $valid = $self->SUPER::validate();

    if ( $self->StateProvince() && $self->CountryCode() ) {
        if ( $self->CountryCode() eq 'US' ) {
            if ( !RPS::StateList::IsValidState( $self->StateProvince() ) ) {
                $self->{StateProvince}->setError(Common::FormObject::kErrInvalidState);
                $valid = 0;
            }
        }
    }

    return $valid;
}

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

    my $dbObj;
    if ( $self->LabelPayeeID() ) {
        $dbObj = RPS::DB::Item::LabelPayee->Lookup( label_payee_id => $self->LabelPayeeID() );
    } else {
        $dbObj = RPS::DB::Item::LabelPayee->Create();
    }

    $dbObj->name( $self->Name() );
    $dbObj->street_address( $self->StreetAddress() );
    $dbObj->street_address_2( $self->StreetAddress2() );
    $dbObj->street_address_3( $self->StreetAddress3() );
    $dbObj->city( $self->City() );
    $dbObj->state_province( $self->StateProvince() );
    $dbObj->country_code( $self->CountryCode() );
    $dbObj->postal_code( $self->PostalCode() );
    $dbObj->email( $self->Email() );
    $dbObj->phone_number( $self->PhoneNumber() );
    $dbObj->fax_number( $self->FaxNumber() );
    $dbObj->tax_id( $self->TaxID() );
    $dbObj->cycle_code( $self->CycleCode() );

    #	$dbObj->min_payment($self->MinPayment());
    $dbObj->begin_month_code( $self->BeginMonthCode() );
    $dbObj->comments( $self->Comments() );

    #	$dbObj->opening_balance($self->OpeningBalance());

    $dbObj->client_payee_id( $self->ClientPayeeID() );
    $dbObj->client_account_id( $self->ClientAccountID() );
    $dbObj->status( $self->Status() );

    # save db item
    #
    $dbObj->save();

    my $payee_id = $dbObj->label_payee_id;
    $self->_processLabelPayeeMinPayment(payee_id => $payee_id);

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

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

    my $payee_id = $args{payee_id} || 0;
    (Common::Log::Print("Unable to set Label Payee Min Payment due to missed payee ID") and return undef) unless $payee_id;

    my $payors = RPS::DB::Item::Payor->GetPayorsWithLabelPayeeMinPayment();

    while ($payors->hasNext()) {
        my $payor = $payors->next;
        $self->{LabelPayeeAccount} = RPS::LabelPayee::LabelPayeeAccount->new( labelPayeeID => $payee_id, payorID => $payor->{payor_id} );
        $self->{LabelPayeeAccount}->{MinPayment} = $payor->{label_payee_min_payment};
        $self->{LabelPayeeAccount}->save;
    }
}

###
1;    #
###
