package Common::DB::ItemArrayCollection;

# This class wraps the DB::ItemCollection interface around an array of DBItems.
# Used in caching, things like that.
#

use strict;
use warnings;
use Carp;
use lib '/app/tools/common/lib';
use Common::RSDB;
use Common::RSApp;
use Common::Assert;
use Common::DB::Item;
use Common::DB::ItemCollection;
use base 'Common::DB::ItemCollection';

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

    assert( exists $args{arrayRef} );
    $self->{_array}     = $args{arrayRef};
    $self->{_index}     = 0;
    $self->{_totalSize} = ( defined $self->{_array} ? scalar @{ $self->{_array} } : 0 );
    $self->{_size}      = ( defined $self->{_array} ? scalar @{ $self->{_array} } : 0 );

    #    $self->{_size} = scalar @{$self->{_array}};
    $self->{_loaded} = 1;

    return $self;
}

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

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

    # Set the index to the start of the requested page.
    #
    $self->{_index} = $args{pageIndex} * $args{pageSize};

    # Set the new size
    #
    $self->{_size} = $self->{_size} - ( $args{pageSize} * $args{pageIndex} );
    if ( $self->{_size} < 0 ) {
        $self->{_size} = 0;
    } elsif ( $self->{_size} > $args{pageSize} ) {
        $self->{_size} = $args{pageSize};
    }
    $self->{_lastIndex} = $self->{_index} + $self->{_size};
}

sub hasNext {
    my ($self) = @_;
    if ( $self->_isPaginated() ) {
        return ( $self->{_index} < $self->{_lastIndex} );
    }

    return ( $self->{_index} < $self->{_size} );
}

sub next {
    my ($self) = @_;
    return undef unless $self->hasNext();

    my $arrayRef = $self->{_array};
    my $obj      = $arrayRef->[ $self->{_index} ];
    $self->{_index}++;

    return $obj;
}

# this will let us iterate through the results
# without creating a DB object (useful for paginated results)
#
sub skip {
    my ($self) = @_;

    $self->{_index}++;
}

sub size {
    my ($self) = @_;
    return $self->{_size};
}

sub totalSize {
    my ($self) = @_;
    return $self->{_totalSize};
}

1;
