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

use strict;
use warnings;

use Common::FormObject;
use base 'Common::FormObject';

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

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

    my $trackID       = $args{trackID};
    my $publisherID   = $args{publisherID};
    my $payorID       = $args{payorID};
    my $productFilter = $args{productFilter};
    my $licenseFilter = $args{licenseFilter};
    my $statusFilter  = $args{statusFilter};

    $self->{TrackLicense} = [];
    if ($trackID) {
        my $collection = $self->_license()->GetLicensesByTrackIDFiltered($trackID, $productFilter, $licenseFilter, $statusFilter);

        my $trackGroups = {};

        while ( $collection->hasNext() ) {
            my $obj = $collection->next();

            # Filter out licenses that don't match if we're looking for crossed licenses.
            #
            if ( $publisherID && $payorID ) {
                my $publisherIDName = $self->_publisherID();
                next unless ( $obj->cross_collateralized && $obj->$publisherIDName == $publisherID && $obj->payor_id == $payorID );
            }

            # Filter out licenses that don't match the status (if we are filtering by status)
            #
            if ($statusFilter) {
                if ( $statusFilter =~ /^active$/ && $obj->inactive == 1 ) {
                    next();
                }
                if ( $statusFilter =~ /^inactive$/ && $obj->inactive == 0 ) {
                    next();
                }
            }

            # group by id/parent_id
            if ( $obj->parent_track_license_id ) {
                push @{ $trackGroups->{ $obj->parent_track_license_id } }, $self->_licenseObj()->new( _dbItem => $obj );
            } else {
                my $licenseIDName = $self->_licenseID();
                push @{ $trackGroups->{ $obj->$licenseIDName } }, $self->_licenseObj()->new( _dbItem => $obj );
            }
        }

        foreach my $id ( keys %$trackGroups ) {
            my $aref = $trackGroups->{$id};
            my $dbItem;
            if ( @$aref > 1 ) {
                my $maxDateObj;
                my $maxDate;
                foreach my $obj ( sort { $b->DateCreated() cmp $a->DateCreated() } @$aref ) {
                    my $checkDate;
                    $checkDate = ( $obj->TermEnd() || $obj->TermStart() );

                    if ( !$dbItem || $checkDate gt $maxDate ) {
                        $maxDate = $checkDate;
                        $dbItem  = $obj;
                    }
                }
            } else {
                $dbItem = pop @$aref;
            }
            push @{ $self->{TrackLicense} }, $dbItem;
        }

        @{ $self->{TrackLicense} } = sort { $b->Type() <=> $a->Type() } @{ $self->{TrackLicense} };
    }

    return $self;
}

sub _listProperties {
    return { TrackLicense => 1 };
}

# This is the special sort of list accessor.
#
sub TrackLicense {
    my ( $self, $index, $methodAddressList, $newValue ) = @_;

    if ( 0 == scalar @$methodAddressList ) {
        if ( defined $newValue ) {
            $self->{TrackLicense}[$index] = $newValue;
        }
        return 1;
    }

    # May need to dynamically add objects to the list...
    #
    if ( !defined $self->{TrackLicense}[$index] ) {
        $self->{TrackLicense}[$index] = $self->_licenseObj()->new();
    }

    return $self->{TrackLicense}[$index]->_accessProperty( $methodAddressList, $newValue );
}

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

    return $self->{TrackLicense};
}

1;

