#------------------------------------------------------------
# Copyright (C) 2009 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package BookPub::Tracker::FileList;

use strict;
use warnings;
use Carp;

use Data::Dumper;

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

use lib '/app/tools/bookpub/lib';
use BookPub::Tracker::File::Display;

use base 'Common::FormObject';

# This class is the abstract base class for our tracker page file listings.
#

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

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

    # !!! Do I want this data to be available in the XML?  Might be handy...
    $self->{periodID}    = $args{periodID};
    $self->{page}        = $args{page};
    $self->{pageSize}    = $args{pageSize};
    $self->{fileType}    = $args{fileType};
    $self->{sortBy}      = $args{sortBy};
    $self->{reverseSort} = $args{reverseSort};
    $self->{serviceID}   = $args{serviceID};

    # Go ahead and create 'space' for the list.  This way we'll have the XML
    # tag even if there are no things in the collection (which makes the templates happy, I think).
    #
    my $itemTag = $self->_itemTag();
    $self->{$itemTag} = [];

    my ( $fileItems, $sortedList, $openFileCount ) = $self->_getItemCollection();

    $self->{openFileCount} = $openFileCount;

    if ($fileItems) {
        if ( $self->{page} ) {
            $fileItems->setPagination( pageIndex => $self->{page}, pageSize => $self->{pageSize} );
            $self->{pageCount}    = $fileItems->numPages;
            $self->{totalRecords} = $fileItems->totalSize;
        }
        $self->{recordsListed} = $fileItems->size;

        if ( ref($sortedList) eq 'ARRAY' ) {
            map { push @{ $self->{$itemTag} }, $self->_getObj($_) } @$sortedList;
        } else    # build list from the Common::DB::ItemCollection
        {
            while ( my $fileItem = $fileItems->next() ) {
                my $fileObj = $self->_getObj($fileItem);
                push @{ $self->{$itemTag} }, $fileObj;
            }
        }
    }

    return $self;
}

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

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

sub _getObj {
    my ( $self, $dbItem ) = @_;
    assert($dbItem);
    return BookPub::Tracker::File::Display->new( dbItem => $dbItem );
}

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

    return $self->{ $self->_itemTag() };
}

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

1;
