#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2009 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#---------------------------------------------------------------
package Common::FormObject::List;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::Assert;
use base 'Common::FormObject';

sub _itemName { assert( 0, 'override' ); }

use constant kDefaultPageSize => 30;
sub _pageSize { return kDefaultPageSize; }

sub _getCollection {
    my ( $self, %args ) = @_;
    assert( 0, 'override' );
}

sub _getObj {
    my ( $self, $dbItem ) = @_;
    assert( 0, 'override' );
}

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

    my $pageSize = $args{pageSize};

    if ( !$pageSize ) {
        $pageSize = $self->_pageSize();
    }

    # Set the pagination parameters here.
    #
    if ( defined $args{currentPage} ) {
        $collection->setPagination( pageIndex => $args{currentPage}, pageSize => $pageSize );
    }
}

sub _initPagination {
    my ( $self, $collection ) = @_;
    assert($collection);
    assert( ref($collection) );

    $self->{Pagination}{PageSize} = $collection->pageSize();
    $self->{Pagination}{NumPages} = $collection->numPages();
    $self->{Pagination}{Page}     = $collection->page();
}

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

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

    # Create an array with our itemName, which will
    # result in an XML blockd with the tag <$itemName>.
    #
    my $itemName = $self->_itemName();
    $self->{$itemName} = [];

    my $collection = $self->_getCollection(%args);
    if ($collection) {
        $self->_paginateCollection( $collection, %args );
        $self->_initPagination($collection);

        while ( my $dbItem = $collection->next() ) {
            my $obj = $self->_getObj($dbItem);
            push @{ $self->{$itemName} }, $obj;
        }
    }

    return $self;
}

sub size {
    my $self = shift;

    my $itemName = $self->_itemName();

    if ( $self->{$itemName} ) {
        scalar @{ $self->{$itemName} };
    } else {
        return 0;
    }
}

1;
