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