#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::ServiceList;

use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::DB::Item::MapFaceService;
use Common::MapFace::MapFaceService;

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

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

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

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

    $self->{Service} = [];
	my $serviceCollection;
	
	if ($args{fileOnly}) {
	    $serviceCollection = RPS::DB::Item::Service->GetAllFileServices();
	} elsif ($args{query}) {
		$serviceCollection = RPS::DB::Item::Service->Search(searchTerm => $args{query}, limit => $args{limit});
	} else {
	    $serviceCollection = RPS::DB::Item::Service->GetAll();
    }
    
	while ($serviceCollection->hasNext())
	{
		my $serviceObj = $serviceCollection->next();
		push @{$self->{Service}}, RPS::Service->new(_dbItem => $serviceObj);
	}
	
	if ($args{mapface}) {
		my $mfServiceCollection;
		
		if ($args{query}) {
		    $mfServiceCollection = Common::DB::Item::MapFaceService->Search(searchTerm => $args{query}, limit => $args{limit});	
		} else {    
		    $mfServiceCollection = Common::DB::Item::MapFaceService->GetAll();
		}    
		    
		while ($mfServiceCollection->hasNext())
		{
			my $serviceObj = $mfServiceCollection->next();
			push @{$self->{Service}}, Common::MapFace::MapFaceService->new(_dbItem => $serviceObj);
		}		
		@{$self->{Service}} = sort {$a->ServiceName() cmp $b->ServiceName()} @{$self->{Service}};
	}

    return $self;
}

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

	my $valid = 1;
	foreach my $service (@{$self->{Service}})
	{
        if (! $service->validate())
        {
            $valid = 0;
        }
	}

	return $valid;
}


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

	foreach my $service (@{$self->{Service}})
	{
		$service->save();
	}
}

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

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

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

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

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

	# May need to dynamically add objects to the list...
	#
	if (! defined $self->{Service}[$index])
	{
		# something bad is happening here
		assert(0);
		# $self->{Service}[$index] = RPS::Service->new(serviceID => $self->{_contractID}, mode => $self->{_mode});
	}

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


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

	return $self->{Service};
}


1;
