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

use strict;

use lib '/app/tools/rps/lib';
use RPS::Contract::PhysicalTerm;
use RPS::Contract::DigitalTerm;
use RPS::DB::Item::ArtistContract;
use RPS::DB::Item::ArtistContractTerm;

use RPS::XMLObject;
use base 'RPS::XMLObject';


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

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

    $self->{Term} = [];

	if($args{contractID} && $args{contractMode})
	{
		$self->{_contractID} = $args{contractID};
		$self->{_contractMode} = $args{contractMode};

		my $collection = RPS::DB::Item::ArtistContractTerm::GetByArtistContractID($args{contractID}, $args{contractMode});
		while (my $obj = $collection->next())
		{
            if (RPS::DB::Item::ArtistContract::kModeNetRevenue == $obj->contract_mode)
            {
			    push @{$self->{Term}}, RPS::Contract::DigitalTerm->new(_dbItem => $obj);
            }
            elsif (RPS::DB::Item::ArtistContract::kModeUnit == $obj->contract_mode)
            {
			    push @{$self->{Term}}, RPS::Contract::PhysicalTerm->new(_dbItem => $obj);
            }
		}
	}

	return $self;
}

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

	my $valid = 1;
	my %unique = ();
	foreach my $term (@{$self->{Term}})
	{
		next if(!defined $term);

		next if($term->Delete());

		# We have to check for duplicates...
		#
		# physical key is: channel_id, price_id, format_id
		#
		if($term->ContractMode() == RPS::DB::Item::ArtistContract::kModeUnit 
		   && $term->ChannelID() && $term->PriceLevelID() && $term->ProductFormatID())
		{
			# check for duplicates
			my $key = $term->ChannelID().$term->PriceLevelID().$term->ProductFormatID();
			if($unique{$key})
			{
				$self->setError(RPS::XMLObject::kErrDuplicate);
				$valid = 0;
			}
			else
			{
				$unique{$key} = 1;
			}
		}

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

	return $valid;
}


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

	foreach my $term (@{$self->{Term}})
	{
		if(defined $term && defined $term->Percent())
		{
			$term->save();
		}
	}
}

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

sub _propertyIsEditable
{
	my ($self, $propertyName) = @_;

	if ($propertyName eq 'Term')
	{
		return 1;
	}
	return 0;
}

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

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

	# May need to dynamically add objects to the list...
	#
	if (! defined $self->{Term}[$index])
	{
		if (RPS::DB::Item::ArtistContract::kModeUnit == $self->{_contractMode})
		{
			$self->{Term}[$index] = RPS::Contract::PhysicalTerm->new(contractID => $self->{_contractID}, contractMode => $self->{_contractMode});
		}
		elsif (RPS::DB::Item::ArtistContract::kModeNetRevenue == $self->{_contractMode})
		{
			$self->{Term}[$index] = RPS::Contract::DigitalTerm->new(contractID => $self->{_contractID}, contractMode => $self->{_contractMode});
		}
		else
		{
			# please don't do this
			#
			assert(0);
		}
	}

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


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

	return $self->{_contractID};
}

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

	return $self->{Term};
}


###
1;#
###

