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

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

use lib '/app/tools/rps/lib';
use RPS::DB::Item::ArtistRoyaltyStatement;
use RPS::Payee::ArtistPayee;

use base 'Common::FormObject';

sub _init {
    my ( $self, %args ) = @_;
    my $timer = Common::Timer->new();

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

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

    $self->_initProperties( \%properties, $args{skipTransactionsList} );

    return $self;
}

sub _propertiesFromDB {
    my ( $self, $hrProperties, $id ) = @_;
    my $timer = Common::Timer->new();

    my $dbItem = RPS::DB::Item::ArtistRoyaltyStatement->Lookup( artist_royalty_statement_id => $id );
    $self->_propertiesFromDBItem( $hrProperties, $dbItem );
}

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

    my $hasActivity = RPS::DB::Item::ArtistRoyaltyStatement->HasActivity( $dbItem->artist_royalty_statement_id );
    my $timer = Common::Timer->new();

    $hrProperties->{artist_royalty_statement_id}           = $dbItem->artist_royalty_statement_id;
    $hrProperties->{artist_royalty_run_id}                 = $dbItem->artist_royalty_run_id;
    $hrProperties->{payee_id}                              = $dbItem->payee_id;
    $hrProperties->{payor_id}                              = $dbItem->payor_id;
    $hrProperties->{cross_collateralized_previous_balance} = $dbItem->cross_collateralized_previous_balance;
    $hrProperties->{cross_collateralized_income_subtotal}  = $dbItem->cross_collateralized_income_subtotal;
    $hrProperties->{cross_collateralized_expense_subtotal} = $dbItem->cross_collateralized_expense_subtotal;
    $hrProperties->{cross_collateralized_subtotal}         = $dbItem->cross_collateralized_subtotal;
    $hrProperties->{previous_balance}                      = $dbItem->previous_balance;
    $hrProperties->{balance}                               = $dbItem->balance;
    $hrProperties->{min_payment}                           = $dbItem->min_payment;
    $hrProperties->{total}                                 = $dbItem->total;

    #    $hrProperties->{subtotal}                               = $dbItem->subtotal;
    $hrProperties->{transaction_subtotal}                           = $dbItem->transaction_subtotal;
    $hrProperties->{amount_due}                                     = $dbItem->amount_due;
    $hrProperties->{on_hold}                                        = $dbItem->on_hold;
    $hrProperties->{license_income_subtotal}                        = $dbItem->license_income_subtotal;
    $hrProperties->{contract_level_license_income_subtotal}         = $dbItem->contract_level_license_income_subtotal;
    $hrProperties->{contract_level_license_income_total}            = $dbItem->contract_level_license_income_total;
    $hrProperties->{contract_level_license_income_previous_balance} = $dbItem->contract_level_license_income_previous_balance;
    $hrProperties->{uncrossed_subtotal}                             = $dbItem->uncrossed_subtotal;
    $hrProperties->{has_activity}                                   = $hasActivity;

    # Custom fields added for RSD-12228
    $hrProperties->{net_sales_total}                                = $dbItem->net_sales_total;
    $hrProperties->{sales_total}                                    = $dbItem->sales_total;
    $hrProperties->{license_income_sales_total}                     = $dbItem->license_income_sales_total;
    $hrProperties->{license_income_total}                           = $dbItem->license_income_total;
    $hrProperties->{expense_amount_total}                           = $dbItem->expense_amount_total;
    $hrProperties->{expense_effective_amount_total}                 = $dbItem->expense_effective_amount_total;

    $hrProperties->{date_sent} = $dbItem->date_sent;
}

sub _initProperties {
    my ( $self, $props ) = @_;
    my $timer = Common::Timer->new();

    $self->{ArtistRoyaltyStatementID} = Common::FormObject::Scalar->new( value => $props->{artist_royalty_statement_id}, readOnly => 1 );
    $self->{ArtistRoyaltyRunID}       = Common::FormObject::Scalar->new( value => $props->{artist_royalty_run_id} );
    $self->{PayeeID}                  = Common::FormObject::Scalar->new( value => $props->{payee_id} );
    $self->{PayorID}                  = Common::FormObject::Scalar->new( value => $props->{payor_id} );
    $self->{CrossCollateralizedPreviousBalance} =
      Common::FormObject::Scalar::Money->new( value => $props->{cross_collateralized_previous_balance} );
    $self->{CrossCollateralizedIncomeSubTotal} =
      Common::FormObject::Scalar::Money->new( value => $props->{cross_collateralized_income_subtotal} );
    $self->{CrossCollateralizedExpenseSubTotal} =
      Common::FormObject::Scalar::Money->new( value => ( -1 * $props->{cross_collateralized_expense_subtotal} ) );
    $self->{CrossCollateralizedSubTotal} = Common::FormObject::Scalar::Money->new( value => $props->{cross_collateralized_subtotal} );
    $self->{PreviousBalance}             = Common::FormObject::Scalar::Money->new( value => $props->{previous_balance} );
    $self->{Total}                       = Common::FormObject::Scalar::Money->new( value => $props->{total} );

    #    $self->{Subtotal}                           = Common::FormObject::Scalar::Money->new(value => $props->{subtotal});
    $self->{TransactionSubtotal} = Common::FormObject::Scalar::Money->new( value => $props->{transaction_subtotal} );
    $self->{Balance}             = Common::FormObject::Scalar::Money->new( value => $props->{balance} );
    $self->{MinPayment}          = Common::FormObject::Scalar::Money->new( value => $props->{min_payment} );
    $self->{AmountDue}           = Common::FormObject::Scalar::Money->new( value => $props->{amount_due} );
    $self->{OnHold} = Common::FormObject::Scalar::Boolean->new( value => $props->{on_hold}, readOnly => 1 );
    $self->{HasActivity} = Common::FormObject::Scalar->new( value => $props->{has_activity} );
    $self->{LicenseIncomeSubtotal} = Common::FormObject::Scalar::Money->new( value => $props->{license_income_subtotal} );
    $self->{ContractLevelLicenseIncomeSubtotal} =
      Common::FormObject::Scalar::Money->new( value => $props->{contract_level_license_income_subtotal} );
    $self->{ContractLevelLicenseIncomeTotal} =
      Common::FormObject::Scalar::Money->new( value => $props->{contract_level_license_income_total} );
    $self->{ContractLevelLicenseIncomePreviousBalance} =
      Common::FormObject::Scalar::Money->new( value => $props->{contract_level_license_income_previous_balance} );

    $self->{ArtistPayee} = RPS::Payee::ArtistPayee->new( artistPayeeID => $props->{payee_id}, loadSubs => 0 );

    if ( $props->{cross_collateralized_subtotal} < 0 ) {
        $self->{UnrecoupedCrossedSubTotal} = Common::FormObject::Scalar::Money->new( value => $props->{cross_collateralized_subtotal} );
        $self->{PayableCrossedSubTotal}    = Common::FormObject::Scalar::Money->new( value => 0.00 );
    } elsif ( $props->{cross_collateralized_subtotal} > 0 ) {
        $self->{PayableCrossedSubTotal}    = Common::FormObject::Scalar::Money->new( value => $props->{cross_collateralized_subtotal} );
        $self->{UnrecoupedCrossedSubTotal} = Common::FormObject::Scalar::Money->new( value => 0.00 );
    } else {
        $self->{UnrecoupedCrossedSubTotal} = Common::FormObject::Scalar::Money->new( value => 0.00 );
        $self->{PayableCrossedSubTotal}    = Common::FormObject::Scalar::Money->new( value => 0.00 );
    }

    # Unlike the 'crossed' totals, we can have both a positive uncrossed subtotal AND some unrecouped negative uncrossed subtotals.
    # Alas, we don't record that stuff in the database.   But we can solve for it.
    #
    my $uncrossedRecouped = $props->{total};
    if ( $props->{cross_collateralized_subtotal} > 0 ) {
        $uncrossedRecouped -= $props->{cross_collateralized_subtotal};
    }

    my $uncrossedUnrecouped = -1 * ( $uncrossedRecouped - $props->{uncrossed_subtotal} );
    $self->{UnrecoupedUncrossedSubTotal} = Common::FormObject::Scalar::Money->new( value => sprintf( "%0.02f", $uncrossedUnrecouped ) );
    $self->{PayableUncrossedSubTotal}    = Common::FormObject::Scalar::Money->new( value => sprintf( "%0.02f", $uncrossedRecouped ) );

    $self->{NetSalesTotal}               = Common::FormObject::Scalar::Money->new( value => $props->{net_sales_total} );
    $self->{SalesTotal}                  = Common::FormObject::Scalar::Money->new( value => $props->{sales_total} );
    $self->{LicenseIncomeSalesTotal}     = Common::FormObject::Scalar::Money->new( value => $props->{license_income_sales_total} );
    $self->{LicenseIncomeTotal}          = Common::FormObject::Scalar::Money->new( value => $props->{license_income_total} );
    $self->{ExpenseAmountTotal}          = Common::FormObject::Scalar::Money->new( value => $props->{expense_amount_total} );
    $self->{ExpenseEffectiveAmountTotal} = Common::FormObject::Scalar::Money->new( value => $props->{expense_effective_amount_total} );

    $self->{DateSent} = Common::FormObject::Scalar::DateTime->new( value => $props->{date_sent} );
}

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

###
1;    #
###
