#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Time::localtime;
use Opals::Context;
use Opals::Template_ajax qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);

use Opals::User qw(
    user_getInformationById
    user_isUserBc
);
use Opals::Circulation qw(
    circ_getItemStatus
    circ_getItemInfo
    circ_processRenew
    circ_record_ODL_ext
);
use Opals::Date qw(
    date_getDeadLineDate
    date_getDeadLineDateTime
    date_text
    date_now
    date_deltaWorkDayHour
    dateTime_parse

);

use Opals::BarcodeMgmt qw(
    bcm_validateBc
);

use Opals::Constant;

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        => 'ajax/circ/renew.tmpl',
        reqPermission   => 'circ_loan|circ_rsrv_self',
    }
);

my $dateDue;
my $tm = localtime;
#my $todayStr = sprintf("%04d-%02d-%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday);
my $todayStr   = date_now();
my $syspref = tmpl_preference($dbh);
my @renewRSArr=();

my ($errCode, $ck, $resp) = Opals::User::user_currentUser($dbh, $cgi);
my $perm=Opals::User::user_permission_1($dbh,$resp->{'uid'});
my $useHasRenewalPerm=$perm->{'circ_loan'} || $perm->{'circ_rsrv_self'};

my $cmdCode = $input->{'cmdCode'};  
my @renewArr = split /,/,$input->{'bcList'};
if(!$perm->{'circ_loan'} && $perm->{'circ_rsrv_self'}){
    $cmdCode =undef; # not allowed to override for self renewal
    @renewArr=filterOwnLoan($dbh,$resp->{'uid'},\@renewArr);
}
if ($useHasRenewalPerm) {
#if ($permission && $permission->{'circ_loan'}) {
    my $uid = $input->{'uid'};
    my $inDueDate  = $input->{'duedate'};  
    my $validateBc = $syspref->{'validateBarcode'}; 
    my $barcodeType = $syspref->{'barcodeType'}; 
    foreach my $barcode(@renewArr){
        $barcode    =~ s/^\s+|\s+$//g;
        $barcode= bcm_validateBc($dbh,$barcode,$barcodeType) if($validateBc eq '1');
        my $renewStatus ={};
        my $renewStatusCode=""; 
        if ($barcode ne '') {    
            my $itemCircStatus = circ_getItemStatus($dbh,$barcode);
            my $l_uid               = $itemCircStatus->{'l_uid'};
            $uid = $l_uid if(!defined $uid || $uid eq '');
            my $itemInfo       = circ_getItemInfo($dbh, $barcode, $l_uid);
            my $timeDue="";
            if($itemInfo->{'loanUnit'} eq 'hour'){
                $dateDue  =  date_getDeadLineDateTime($itemInfo->{'renewalPeriod'},$todayStr);
                $timeDue  =substr $dateDue,11,5;
            }
            else{
                $dateDue  = ($inDueDate ne '')? "$inDueDate 23:59:59" : date_getDeadLineDate($itemInfo->{'renewalPeriod'},$todayStr);
            }

            my $dueDateStr= date_text($dateDue, 0);
           $renewStatus ={  
                                uid=>$uid,
                                barcode=>$barcode,
                                dateDue=>$dueDateStr,
                                timeDue=>$timeDue,
                                lid =>$itemCircStatus->{'l_idloan'},
                                rid =>$itemInfo->{'rid'},
                                title =>$itemInfo->{'title'},
                                author=>$itemInfo->{'author'},
                                pubName=>$itemInfo->{'pubName'},
                                price=>$itemInfo->{'price'},
                             };

              my ($borrower, $guardian) = 
              user_getInformationById($dbh, $uid);
              $renewStatus->{'firstname'}=$borrower->{'firstname'};
              $renewStatus->{'lastname'}=$borrower->{'lastname'};
              $renewStatus->{'buildingcode'}=$borrower->{'buildingcode'};
              $renewStatus->{'homeroom'}=$borrower->{'homeroom'};
              $renewStatus->{'grade'}=$borrower->{'grade'};
              $renewStatus->{'categorycode'}=$borrower->{'categorycode'};
            # cmdCode
            # CASE 1: renewal reaches max allowance.
            # CASE 2: Override block to renewal this item since this item has reserve forsomeone

            # renewalMsgCode:
            # renewal ok                :01        
            # item on loan but reserved :02
            # renewal not allowed       :03
            # renewal reaches max       :04
            # item doesnot exist        :05
            # item not on loan          :06
            # item not on loan for current user :07
            
            my $renewal =undef;        
            if($cmdCode && ($cmdCode eq '02' || $cmdCode eq '04') && $itemCircStatus->{'maxRenewal'}>=0){
                    $renewal = circ_processRenew($dbh,$uid,$barcode,$dateDue);
                    $renewStatusCode="01";
             }
            elsif($cmdCode && $cmdCode eq '01' && $itemCircStatus->{'status'}==IT_STAT_ONLOAN){
                    $renewal = circ_processRenew($dbh,$uid,$barcode,$dateDue);
                    $renewStatusCode="01";
             }
                 
            elsif($itemCircStatus->{'status'}==IT_STAT_ONLOAN){
                if($uid ne $itemCircStatus->{'l_uid'}){
                    $renewStatusCode="07";
                }
                elsif($itemCircStatus->{'maxRenewal'}==0){
                    $renewStatusCode="03";
                  }
                elsif($itemCircStatus->{'renewalCount'} >= $itemCircStatus->{'maxRenewal'}){
                    $renewStatusCode="04";
                   }

                elsif($itemCircStatus->{'renewalCount'} < $itemCircStatus->{'maxRenewal'}){
                    $renewal = circ_processRenew($dbh,$uid,$barcode,$dateDue);
                    $renewStatusCode="01";
                }
            }
            else{

                    if($itemCircStatus->{'status'}==IT_STAT_NOEXIST){
                        $renewStatusCode="05";
                        my $tmpUid =user_isUserBc($dbh,$barcode);
                        if($tmpUid>0){
                            $renewStatusCode='19';
                        }

                    }
                    elsif ($itemCircStatus->{'status'} == IT_STAT_HAVE_RSVR) {
                        # TRICKY CASE: 1 record may have more than 1 holding
                        # there is 1 or more on loan and at least 1 on reserve
                        $renewStatusCode="02";
                    }
                    elsif ($itemCircStatus->{'status'} != IT_STAT_ONLOAN) {
                        $renewStatusCode="06";
                    }
                               

           } #else if($itemCircStatus->{'status'}==IT_STAT_ONLOAN)     
           $renewStatus->{'renewalMsgCode'}= $renewStatusCode;                       
           if(defined $renewal){
                $renewStatus->{'odl_id'}        = $renewal->{'odl_id'};
                $renewStatus->{'loanType'}      = $renewal->{'loanType'};
                $renewStatus->{'daysOverdue'}   = $renewal->{'daysOverdue'};
                $renewStatus->{'hoursOverdue'}  = $renewal->{'hoursOverdue'};
           }
           push @renewRSArr,$renewStatus;
                my $curLidList = "";
                if ($cgi->cookie('borrower_curLidList') ne ""){
                    $curLidList = $cgi->cookie('borrower_curLidList') . ',' ;
                }
                $curLidList .= $renewStatus->{'lid'};

                push @$cookie, $cgi->cookie(
                    -name   => 'borrower_curLidList',
                    -value  => $curLidList
                );
             
         }#if ($barcode ne '')
    }
    $template->param(renewalList=>\@renewRSArr);
     
      
}
tmpl_write($dbh, $cgi, $cookie, $template, 'application/json');

#########################################################################
#sub doRenewal_obsolete {
#    my($dbh,$uid,$barcode,$dateDue)=@_;
#    my $today = date_now() ;
#    my $overdue=getOverdue($dbh,$uid,$barcode,$today);    
#    if($overdue->{'daysOverdue'} >0 || $overdue->{'hoursOverdue'}>0){ 
#        my $odl_id = circ_record_ODL_ext($dbh,$overdue->{'lid'},'overdue',
#                                         $overdue->{'daysOverdue'},$overdue->{'hoursOverdue'} );
#        $overdue->{'odl_id'}=$odl_id;
#    }
#    my $r = circ_processRenew($dbh,$uid,$barcode,$dateDue);
#    return $overdue;
#}
#########################################################################
#sub getOverdue{
#    my($dbh,$uid,$barcode,$dateRenew)=@_;
#    my $sth = $dbh->prepare("select idloan, dateDue from opl_loan where uid=? && barcode=? && dateReturn is null");
#    $sth->execute($uid,$barcode);
#    my $rec         = $sth->fetchrow_hashref;
#    my $idloan      = $rec->{'idloan'};
#    my $dateRet     = dateTime_parse($dateRenew);
#    my $dateDue     = dateTime_parse($rec->{'dateDue'});
#    my $timeDd      = "23:59:59";
#    my $loanType='daily';
#    if($rec->{'dateDue'} =~ m/(\d\d\d\d-\d\d-\d\d) (\d\d:\d\d:\d\d)/g){
#       $timeDd =$2;
#    }
#    if($timeDd ne "23:59:59"){ #Case: Hourly Circ
#        $loanType='hourly';
#    }
#
#    my ($mumOfDaysOD , $mumOfHoursOD,$mumOfMinuteOD)= date_deltaWorkDayHour($dateDue, $dateRet);
#    my $odl_id      = 0;
## check grace period  
#  
#    my $itemInfo   = circ_getItemInfo($dbh, $barcode, $uid);
#    my ($graceDay,$graceHour,$graceiMinute)=(0,0,0);
#    if(defined $itemInfo->{'gracePeriod'} && defined $itemInfo->{'graceUnit'} ){
#        if($itemInfo->{'graceUnit'} eq 'day'){
#            $graceDay=$itemInfo->{'gracePeriod'};
#        }
#        elsif($itemInfo->{'graceUnit'} eq 'minute'){
#            $graceiMinute=$itemInfo->{'gracePeriod'};
#        }
#        else{
#            $graceHour=$itemInfo->{'gracePeriod'};
#        }
#    }
#    
#    if(60*(24*$mumOfDaysOD + $mumOfHoursOD) + $mumOfMinuteOD >(60*(24*$graceDay + $graceHour) + $graceiMinute)){
#        $mumOfHoursOD +=1 if($mumOfMinuteOD>0);
#        if($loanType ne 'hourly'){
#            $mumOfDaysOD +=1 if($mumOfHoursOD>0);
#            $mumOfHoursOD=0
#        }
#
#    }
#    else{
#        $mumOfDaysOD    =0;
#        $mumOfHoursOD   =0;
#    }
##/check grace period
#
#    my $overDue={lid      =>$idloan,
#                loanType =>$loanType,
#                daysOverdue=>$mumOfDaysOD,
#                hoursOverdue=>$mumOfHoursOD
#                };
#   return $overDue;
#
#
#}
#
sub filterOwnLoan{
    my($dbh,$uid,$bcList)=@_;
    my @ret=();
    my $bcListStr=join("','",@$bcList);
    my $sth=$dbh->prepare("select barcode from opl_loan where dateReturn is null && dateDue>now() && uid= ?  && barcode in('$bcListStr')");
    $sth->execute($uid);
    while(my($bc)=$sth->fetchrow_array){
        push @ret,$bc;
    }
    return @ret;
}


#-------------------------------------------------------------------------------------------



