#------------------------------------------------------------
# Copyright (C) 2008 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package Raptor::Tracker::LicenseIncomeHash;

use strict;
use warnings;

use Data::Dumper;

use lib '/app/tools/raptor/lib';
use Raptor::Tracker::LicenseIncome;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::LicenseIncome;

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

use Common::FormHash;
use base 'Common::FormHash';

sub _tagName {
    return 'LicenseIncome';
}

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

    if ( !$args{fileID} ) {
        return undef;
    }

    my $collection = RPS::DB::Item::LicenseIncome->GetByFileID( $args{fileID} );
    return $collection;
}

sub _keyMethodName {
    return 'LicenseIncomeID';
}

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

    if ( $self->{_fileID} ) {
        return Raptor::Tracker::LicenseIncome->new( fileID => $self->{_fileID} );
    }

    return Raptor::Tracker::LicenseIncome->new();
}

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

    return Raptor::Tracker::LicenseIncome->new( _dbItem => $dbItem );
}

sub _addObject {
    my ( $self, $object ) = @_;

    # !!! Just a stub for now
    #
    $self->SUPER::_addObject($object);
}

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

    # We want to keep track of the contract ID for later.
    #
    if ( $args{fileID} ) {
        $self->{_fileID} = $args{fileID};
    }

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

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

    my $tag = $self->_tagName();
    my @keys = sort { $a <=> $b } keys %{ $self->{$tag} };
    return \@keys;
}

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

    my $valid = 1;
    foreach my $id ( keys %{ $self->{LicenseIncome} } ) {
        my $item = $self->{LicenseIncome}{$id};
        next if ( !defined $item );

        if ( !$item->validate() ) {
            $valid = 0;
        }
    }

    return $valid;
}

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

    my $fileID = $args{fileID};
    assert($fileID);

    foreach my $id ( keys %{ $self->{LicenseIncome} } ) {
        my $obj = $self->{LicenseIncome}{$id};

        # !!! We don't want to bother calling save on stuff that has no data.
        # !!! In addition, we should eliminate these empty items that were created
        # !!! by the form in order to contain new records.
        #
        # !!! The _hasData element is populated by validate, so this presumes we've called validate().
        #
        if ( $obj->{_hasData} ) {
            $obj->FileID($fileID);
            $obj->save();
        } else {

            # Remove the empty object from the internal hash, so it won't be 'counted'.
            #
            delete $self->{LicenseIncome}{$id};
        }
    }

    return 1;
}

sub getUnitsAndRevenue {
    my ($self) = @_;
    my ( $units, $revenue );

    foreach my $id ( keys %{ $self->{LicenseIncome} } ) {
        my $obj = $self->{LicenseIncome}{$id};

        # SKIP items marked for death...
        #
        next if $obj->Delete();

        $units   += $obj->Units();
        $revenue += $obj->Revenue();
    }

    return ( $units, $revenue );
}

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

    return $self->{_fileID};
}

#sub createSales
#{
#    my ($self) = @_;
#
#    foreach my $id (keys %{$self->{LicenseIncome}})
#    {
#        my $obj = $self->{LicenseIncome}{$id};
#        $obj->createSale();
#    }
#
#}

#sub deleteSales
#{
#    my ($self) = @_;
#
#    foreach my $id (keys %{$self->{LicenseIncome}})
#    {
#        my $obj = $self->{LicenseIncome}{$id};
#        $obj->deleteSale();
#    }
#
#}

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

    foreach my $id ( keys %{ $self->{LicenseIncome} } ) {
        my $obj = $self->{LicenseIncome}{$id};
        $obj->delete();
    }

}

###
1;    #
###
