#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;
use Date::Calc qw(Day_of_Week Week_Number Day_of_Year);
use Date::Calc::Object qw(
    :all
);
use Time::localtime;

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
    tmpl_rangedPageList
);

use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::Date qw(
    date_f005

);

use Opals::BookingSystem qw(
    bs_getBookingList
    bs_getBookingListByGrp
    bs_getBooikngItemList
    bs_numBItemLoan

);

use Opals::Circulation qw(
    circ_numItemOnHold4Uid
);

use Opals::User qw(
    user_getInformationById
);

use Opals::Date qw(
    date_now
);
################################################################################
my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

my $cgi = CGI->new;
my $input = $cgi->Vars();
my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'circ/bList.tmpl',
            reqPermission   => 'circ_rsrv_self|circ_rsrv',
        }
);

    my $dateToday = date_f005();
    $dateToday =~ s/([\d]{4})([\d]{2})([\d]{2})[\d]+\.(0|1)/$1-$2-$3/;
my $syspref          = tmpl_preference($dbh);
my $loginuid         = $template->param('curUserId');

my @cookieList  = (@$cookie);
my $tm          = localtime;
my $todayStr    = sprintf("%04d-%02d-%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday);
my $dFirst      = Opals::Context->preference('dateFirst');
my $dLast       = Opals::Context->preference('dateLast');

my $dateFrom    = $input->{'rFrom'};
my $dateTo      = $input->{'rTo'};
my $dateRange   = $input->{'dateRangeOpt'};
if(!$dateRange || $dateRange eq ''){
    $dateRange = "range_fYear";
    $dateFrom= $dFirst;
    $dateTo  = $dLast;
}

if ($dateRange eq "range_all"){
    $dateFrom= "1970-01-01";
    #$dateTo  = $dateToday;
    $dateTo  = $dLast;
}

    $dateFrom = $dateToday if ( !$dateFrom );
    $dateFrom .= " 00:00:00";
    $dateTo = $dateToday if ( !$dateTo );
    $dateTo .= " 23:59:59";

my @bookingStatusList = ($cgi->param('bookingStatus'));
my $grp                 = $input->{'group'};
my $term                = $input->{'term'};
my $term                = $input->{'term'};

my $pagesize = 20;
my $pNum = $input->{'pNum'};
$pNum = 1 if ( !$pNum );
my $sort    = $input->{'sort'};
my $sortDir = $input->{'sortDir'};
if ( !$sort ){
    $sort    = 'createdDate';
    $sortDir = 'desc'  ;
}
my ($numOfReserves,$bList);
my ($enableBookingListCmd,$alowProcessBooking,$circ_booking)=(0,0,0);

my $op = $input->{'op'};
    my $myFilter ={};
    my @statusList=(); 
if ($permission &&  $permission->{'circ_rsrv'}){
    ($enableBookingListCmd,$alowProcessBooking,$circ_booking)=(1,0,1);
    if($op eq 'reminder'){
        @bookingStatusList = qw(processing);
        $dateFrom =  $dateToday;
        $dateTo =    '';
    }
    
        $myFilter->{dateFrom}   = $dateFrom;
        $myFilter->{dateTo}     = $dateTo; 

        if($term && $grp && $term ne'' && $grp ne ''){
            $myFilter->{$grp} = $term; 
        }
        if( scalar(@bookingStatusList)>0){
            $myFilter->{status} =\@bookingStatusList; 
        }
    

    my $timeNow = date_now();
    ($numOfReserves,$bList)  = bs_getBookingList($dbh,$myFilter,$pNum,$pagesize,$sort,$sortDir);
    my ($numHold, $numLoan)=(0,0);
    my ($userInfo, $guardian);
        foreach my $booking(@{$bList}){
            ($userInfo, $guardian) =user_getInformationById($dbh, $booking->{'reqUid'});
            $booking->{'reqEmail'} = $userInfo->{'email'};
            ($numHold, $numLoan)=(0,0);
            $booking->{'itemList'}=bs_getBooikngItemList($dbh,$booking->{'bookingId'});
            foreach my $item(@{$booking->{'itemList'}}){
                $numHold    += circ_numItemOnHold4Uid($dbh,$item->{'rid'},$booking->{'reqUid'});
                $numLoan    += bs_numBItemLoan($dbh,$booking->{'bookingId'},$item->{'rid'},1);
            }
            $booking->{'totalOnHold'} = $numHold + $numLoan;
            $booking->{'totalOnLoan'} = $numLoan;
            if($booking->{'reserveTo'} lt $timeNow) { $booking->{'isexpire'} =1;}

        }

    
    foreach  my $status(@bookingStatusList){
        push @statusList,{bookingStatus=>$status};
        $template->param(
            "_$status"  =>1,
        );
    }
    
}

elsif($permission->{'circ_rsrv_self'}){
    $enableBookingListCmd=1;
    $myFilter->{'requestUid'}       = $loginuid;
    $myFilter->{'bookingForUid'}    = $loginuid;
    ($numOfReserves,$bList)  = bs_getBookingListByGrp($dbh,$myFilter,$pNum,$pagesize,$sort,$sortDir);
 
}
    my @rangedPageList          = tmpl_rangedPageList($numOfReserves, $pNum, $pagesize, 10);
    $template->param(
        pNum            => $pNum,
        bList           => $bList,
        sort            => $sort,
        sortDir         => $sortDir,
        numOfReserves   => $numOfReserves,
        rangedPageList  => \@rangedPageList,
        enableBookingListCmd=>$enableBookingListCmd,
        alowProcessBooking=>$alowProcessBooking,
        circ_booking=>$circ_booking,      
        rFrom       =>($dateRange eq "range_all")?"": substr($dateFrom, 0, 10),
        rTo         =>($dateRange eq "range_all")?"": substr($dateTo, 0, 10),
        $dateRange  => 1,
        dateRangeOpt=>$dateRange,
        group=>$grp,
        term=>$term,
        bookingStatusList=>\@statusList,

    );
    $template->param(hlpUrl     => Opals::Constant->getHlpUrl('loan') );
    my $msgMap =loc_getMsgFile('circ/booking.msg');
    loc_write($template,$msgMap);
    tmpl_write($dbh, $cgi, \@cookieList, $template);

#if ($permission && ($permission->{'circ_rsrv_self'}|| $permission->{'circ_rsrv'}))


################################################################################
sub isValidDateStr{
    my ($dateStr)=@_;
    return ($dateStr =~ m/\d{4}-\d{1,2}-\d{1,2}/g);
}




