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

use strict;
use warnings;
use Carp;

use Data::Dumper;

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

use lib '/app/tools/rps/lib';

use RPS::DB::Item::MechanicalStatementItem;

use RPS::DB::Item::Album;
use RPS::DB::Item::Product;
use RPS::DB::Item::StatRate;

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

    $self->_initProperties( \%properties );

    return $self;
}

sub _propertiesFromDB {
    my ( $self, $hrProperties, $id ) = @_;
    assert( 0, 'override this' );
}

sub _propertiesFromDBItem {
    my ( $self, $hrProperties, $dbItem ) = @_;
    assert( 0, 'override this' );
}

sub _getCurrencyCode {
    assert( 0, 'override this' );
}

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

    # !!! Assume USD for now...
    #
    my $currencyCode = $self->_getCurrencyCode();

    $self->{MechanicalStatementItemID} = Common::FormObject::Scalar->new( value => $props->{mechanical_statement_item_id}, readOnly => 1 );
    $self->{MechanicalStatementID}     = Common::FormObject::Scalar->new( value => $props->{mechanical_statement_id} );
    $self->{TrackLicenseID}            = Common::FormObject::Scalar->new( value => $props->{track_license_id} );
    $self->{ProductID}                 = Common::FormObject::Scalar->new( value => $props->{product_id} );
    $self->{IssueStatRateID}           = Common::FormObject::Scalar->new( value => $props->{issue_stat_rate_id} );
    $self->{SaleStatRateID}            = Common::FormObject::Scalar->new( value => $props->{sale_stat_rate_id} );
    $self->{AppliedStatRateID}         = Common::FormObject::Scalar->new( value => $props->{applied_stat_rate_id} );
    $self->{GrossUnits} = Common::FormObject::Scalar::Integer->new( value => $props->{gross_units} );
    $self->{NetUnits}   = Common::FormObject::Scalar::Integer->new( value => $props->{net_units} );
    $self->{Liquidated} = Common::FormObject::Scalar::Integer->new( value => $props->{liquidated} );
    $self->{BaseRate}   = Common::FormObject::Scalar::Decimal->new( value => $props->{base_rate}, precision => '.4' );
    $self->{NetRate}    = Common::FormObject::Scalar::Decimal->new( value => $props->{net_rate}, precision => '.4' );
    $self->{Total}      = Common::FormObject::Scalar::Money->new( value => $props->{total},       currencyCode => $currencyCode );
    $self->{AmountPaid} = Common::FormObject::Scalar::Money->new( value => $props->{amount_paid}, currencyCode => $currencyCode );
    $self->{Carryover}         = Common::FormObject::Scalar::Integer->new( value => $props->{carryover} );
    $self->{PreviousCarryover} = Common::FormObject::Scalar::Integer->new( value => $props->{previous_carryover} );

    #    $self->{FreeGoods}                  = Common::FormObject::Scalar::Decimal->new(value => 0);
    $self->{Sales} = Common::FormObject::Scalar::Integer->new( value => $props->{sales} );

    # These are stored as positive values in the database, but I want them to display as negative...
    $self->{Reserved} = Common::FormObject::Scalar::Integer->new( value => -1 * $props->{reserved} );
    $self->{Returns}  = Common::FormObject::Scalar::Integer->new( value => -1 * $props->{returns} );

    $self->{UPC}             = Common::FormObject::Scalar::String->new( value => $props->{upc},                  maxlength => 32 );
    $self->{ISRC}            = Common::FormObject::Scalar::String->new( value => $props->{isrc},                 maxlength => 32 );
    $self->{ReportingPeriod} = Common::FormObject::Scalar::String->new( value => $props->{hfa_reporting_period}, maxlength => 8 );

    $self->{DistributionService} = Common::FormObject::Scalar::String->new( value => $props->{service}, maxlength => 32 );

    $self->{TrackLicense} = $self->_getTrackLicense( $props->{track_license_id} );

    # JPK - The form will want some additional data regarding this track, such as album and product id.
    #
    my $trackID = $self->{TrackLicense}->TrackID();

    # then let's get the album info
    #
    my $album = RPS::DB::Item::Album->GetByTrackID($trackID);
    $self->{AlbumName} = Common::FormObject::Scalar::String->new( value => $album->title );
    $self->{AlbumID} = Common::FormObject::Scalar->new( value => $album->album_id );

    # then let's get the product info
    #
    my $product = RPS::DB::Item::Product->Lookup( product_id => $props->{product_id} );
    $self->{ProductCode} = Common::FormObject::Scalar::String->new( value => $product->product_code );
    $self->{ProductTypeID} = Common::FormObject::Scalar->new( value => $product->product_type_id );
}

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

###
1;    #
###

