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

use strict;
use warnings;

use lib '/app/tools/rps/lib';
use Common::FormObject;
use base 'Common::FormObject';

use constant kDefaultPageSize  => 50;
use constant kDefaultRecordNum => 1;

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

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

    return $self->_initWithArgs(%args);
}

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

    my $pageSize     = $args{pageSize} || kDefaultPageSize;
    my $recordNum    = $args{recordNum};
    my $pageNum      = $args{pageNum};
    my $total        = $args{total};
    my $pageFraction = 0;

    $recordNum = 1 if ( $recordNum && $recordNum < 1 );
    $pageNum   = 1 if ( $pageNum   && $pageNum < 1 );

    Common::Log::Debug("PAGE: $pageNum") if ($pageNum);

    # Indexing by record number
    if ($recordNum) {
        $pageNum = int( $recordNum / $pageSize ) + 1;
        $pageFraction = ( $recordNum - 1 ) % $pageSize ? 1 : 0;

        # Indexing by page number
    } elsif ($pageNum) {
        $recordNum = ( ( $pageNum - 1 ) * $pageSize ) + 1;

        # Using default
    } else {
        $recordNum = kDefaultRecordNum;
        $pageNum   = int( $recordNum / $pageSize ) + 1;
    }

    my $realPageCount = $total / $pageSize;
    my $totalPages    = int($realPageCount);
    $totalPages++ if ( $realPageCount > $totalPages );

    my $next = ( $total > $pageNum * $pageSize ) ? $pageNum + 1 : undef;
    my $prev = ( $pageNum > 1 ) ? $pageNum - 1 : undef;

    my $nextRecord = ( $recordNum + $pageSize );
    my $prevRecord = ( $recordNum - $pageSize );

    $nextRecord = undef if ( $nextRecord > $total );
    $prevRecord = undef if ( $prevRecord < 1 );

    $prevRecord = $recordNum > 1 ? 1 : undef unless ($prevRecord);

    $pageNum    += $pageFraction;
    $totalPages += $pageFraction;

    # !!! Why are we using the Scalar class here?  We don't _set_ these values via cgi...
    #
    $self->{Total}          = Common::FormObject::Scalar->new( value => $total );
    $self->{TotalPages}     = Common::FormObject::Scalar->new( value => $totalPages );
    $self->{PageSize}       = Common::FormObject::Scalar->new( value => $pageSize );
    $self->{Current}        = Common::FormObject::Scalar->new( value => $pageNum );
    $self->{Next}           = Common::FormObject::Scalar->new( value => $next );
    $self->{Previous}       = Common::FormObject::Scalar->new( value => $prev );
    $self->{CurrentRecord}  = Common::FormObject::Scalar->new( value => $recordNum );
    $self->{NextRecord}     = Common::FormObject::Scalar->new( value => $nextRecord );
    $self->{PreviousRecord} = Common::FormObject::Scalar->new( value => $prevRecord );

    return $self;
}

sub inRange {
    my ( $self, $count ) = @_;

    return ( $count >= ( $self->Current() - 1 ) * $self->PageSize() && $count < $self->Current() * $self->PageSize() );
}

###
1;    #
###
