#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use Opals::Context;
use Opals::Constant;
use JSON;
use Opals::Template qw(
    tmpl_preference
);
use Opals::User qw(
    user_getInformationById
);
use Opals::Tb_Circulation qw(
    circ_getItemStatus
    circ_getItemInfo
    circ_processRenew
);
use Opals::Date qw(
    date_getDeadLineDate
    date_text
    date_now
);

my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

my $cgi      = CGI->new;
my $todayStr   = date_now();
my $syspref = tmpl_preference($dbh);
my ($errCode, $ck, $user) = Opals::User::user_currentUser($dbh, $cgi);
my $loginuid   = $user->{'uid'};
my @renewRSArr=();
my $input = {};
my ($uid, $cmdCode,$dueDate);
my $renewalMsg = [];

if ($ENV{'REQUEST_METHOD'} eq "POST") {
   $input = decode_json($cgi->param('POSTDATA'));
   $uid = $input->{'uid'};
   $cmdCode = $input->{'cmdCode'};
   $dueDate = $input->{'dateDue'};
   foreach my $bc(@{$input->{'bcList'}}){
        push @$renewalMsg , processRenew($dbh,$bc,$cmdCode,$uid,$dueDate);
   }
}#if ($ENV{'REQUEST_METHOD'} eq "POST")
print "Content-type: text/plain\n\n";
print   to_json({ 
    uid           => $uid,
    renewalMsgList => $renewalMsg,
});


#--------------------------------------------------------------------------------
# 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
#--------------------------------------------------------------------------------

sub processRenew {
    my ($dbh,$barcode,$cmdCode,$uid,$dDate) = @_;
    my $renewStatus =0;
    my $renewStatusCode=""; 
    my $itemCircStatus = circ_getItemStatus($dbh,$barcode);
    print debug "dDate: $dDate \n";
    my $l_uid               = $itemCircStatus->{'l_uid'};
    my $itemInfo       = circ_getItemInfo($dbh, $barcode, $l_uid);
    my $dateDue  = ($dDate ne '')? "$dDate 23:59:59" : date_getDeadLineDate($itemInfo->{'renewalPeriod'},$todayStr);
    print debug "dateDue:$dateDue (==$dDate)\n";
    if($cmdCode 
        && ($cmdCode eq '01'|| $cmdCode eq '02')){
            $renewStatus = 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'}){
            $renewStatus = circ_processRenew($dbh,$uid,$barcode,$dateDue);
            $renewStatusCode="01";
        }
    }
    else{
            if($itemCircStatus->{'status'}==IT_STAT_NOEXIST){
                $renewStatusCode="05";
            }
            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)   
   my $dueDateStr= date_text($dateDue, 1, $syspref->{'lang'});
   my $return = { uid=>$uid,
                  renewalStatusCode=>$renewStatusCode,
                  itemInfo=>{
                        barcode=>$barcode,
                        dueDate=>$dueDateStr,
                        rid =>$itemInfo->{'rid'},
                        title =>$itemInfo->{'title'},
                        author=>$itemInfo->{'author'},
                        pubName=>$itemInfo->{'pubName'},
                        price=>$itemInfo->{'price'},
                    }
                };
    return $return  
}   

