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

    $self->{TrackLicense} = [];
	if ($trackID)
	{
		my $collection = $self->_license()->GetLicensesByTrackID($trackID);

		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);
            }

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

