#------------------------------------------------------------
# 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;#
###



