#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use JSON;

use Opals::Context;

use Opals::User qw(
    user_getInformationById
    user_isUserBc
    user_getUserCircInfo
);
use Opals::Constant;

use Opals::Template qw(
    tmpl_preference
);

use Opals::Equipment qw(
    eq_item_findByBarcode
);
use Opals::Eq_Circulation qw(
    
    circ_getItemInfo
    circ_getItemStatus
    
    circ_getUserCircStatus
    circ_getUserListLoan
    circ_getUserListReserve
    circ_getUserLoanHistory

    circ_processLoan
    circ_processReturn
    circ_processRenew

    circ_fillHold
    circ_placeHold
    circ_cancelHold
    circ_cancelHold_all
    circ_isOnHold

    circ_fillReserve
    circ_placeReserve
    circ_cancelReserve
    circ_resetReserve

    circ_declareLost
    circ_setAvailable
    circ_record_ODL

);
use Opals::Date qw(

    date_time_text
    date_now
    date_parse
    date_getDeadLineDate
    date_deltaWorkDay
    date_getDeadLineDateTime
);

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

my $syspref    = tmpl_preference($dbh);
my $validateBc       = $syspref->{'validateBarcode'};
my $barcodeType      = $syspref->{'barcodeType'};

my $todayStr   = date_now();
my $input = {};
my ($msgCode,$itemMsgCode,$processCode,$userMsgCode)=(undef,undef,undef,undef);
my $reqItem;
my $tmpUser;
my ($uid,$barcode,$loanType,$dueDate,$cmdCode,$op);
my $dateDueFormat_text="";
my $cmdCode = "";
my $renewalMsg = [];

if ($ENV{'REQUEST_METHOD'} eq "POST") {
   $input = decode_json($cgi->param('POSTDATA'));
   ($uid,$barcode,$loanType,$dueDate,$op) = (0,"","","","");
   $uid = $input->{'uid'};
   $barcode = $input->{'barcode'};
   $loanType = $input->{'loanType'};
   $dueDate = $input->{'dateDue'} || $input->{'hourDue'};
   if ($loanType eq "day" || $loanType eq "hour"){
        $dueDate = formatStrDateDue($dueDate, $loanType); 
   }
   my ($userInfo, $guardian) = user_getInformationById($dbh, $uid);
   foreach my $bc(@{$input->{'bcList'}}){
        push  @$renewalMsg, processRenew($dbh,$uid,$bc, $dueDate,0);
   }
} #if ($ENV{'REQUEST_METHOD'} eq "POST")
print "Content-type: text/plain\n\n";
print   to_json({ 
    uid => $uid,
    renewalMsgList  => $renewalMsg,
});

#-------------------------------------------------------------
sub getUserCircInfo{
    my ($dbh, $uid) = @_;
    my $userInfo=undef;
    my ($user, $guardian) = user_getInformationById($dbh, $uid);
    if(defined $user){
        $userInfo={};
        foreach my $f (qw(uid userbarcode username firstname lastname nickname homeroom teacher grade program studies notes status expired categorycode email)){
            $userInfo->{$f}=$user->{$f};
        }
    }
    my $userCircInfo->{'info'} = $userInfo;
    $userCircInfo->{'loanList'}= circ_getUserListLoan($dbh, {uid=>$uid});
    $userCircInfo->{'loanHistoryList'}    = circ_getUserLoanHistory($dbh, {uid=>$uid});
    
    return $userCircInfo;
}

sub getMsgCode_user{
    my ($userStatus)=@_;
    return $userStatus->{'status'}.$userStatus->{'overdue'}.$userStatus->{'maxLoan'}.$userStatus->{'maxRenew'}.$userStatus->{'maxReserve'};
}
sub formatStrDateDue{
    my ($t_date,$h_d) = @_;
    my $retDD;
    return if ($t_date eq '' || $h_d eq '');
    if ($h_d eq 'd' || $h_d eq 'day' ){
        return $retDD = $t_date . ' 23:59:59';
    }
    return $retDD = `date -d '$t_date hour' '+%Y-%m-%d %H:%M:%S'`;
}
sub getItemDueDate{
    my($loanPeriod,$loanUnit, $todayStr) = @_;
    my $retDD;
    #return $retDD = `date -d '$loanPeriod hour' '+%Y-%m-%d %H:%M:%S'`
    if ($loanUnit eq 'hour' ){
        $retDD = date_getDeadLineDateTime($loanPeriod, $todayStr);
    }
    else {
        $retDD = date_getDeadLineDate($loanPeriod, $todayStr);
    }
    return $retDD;
}
sub getReserveId{
    my ($uid, $list)=@_;
    if (!$list){
        return 0;
    }
    foreach my $id(@$list){
        if ($id->{'uid'} == $uid){
            return $id->{'idReserve'};
        }
    }
    return 0;
}
 
sub processRenew{
    my ($dbh, $uid, $barcode, $rnDateDue,$override)= @_;
    my $retVal;
    my $renewable = 0;
    my $itemCircStatus  = circ_getItemStatus($dbh, {barcode=>$barcode });
    my $itemInfo        = circ_getItemInfo($dbh,$barcode,$uid);
    $retVal->{'itemInfo'} = $itemInfo;
    $retVal->{'itemInfo'}->{'barcode'} = $barcode;
    $renewable = $override?1:($itemCircStatus->{'renewalCount'}<$itemCircStatus->{'maxRenewal'})?1:0;
    $retVal->{'renewable'}=$renewable;
    my $renewStatus = 0;
    if ($itemCircStatus->{'l_uid'} == $uid && $renewable){
        my $dueDate = ($rnDateDue ne '')?$rnDateDue:getRenewDueDate($itemInfo->{'renewalPeriod'}, $itemCircStatus->{'l_duedate'},$todayStr);
        $retVal->{'dueDate'}=$dueDate;
        $renewStatus = circ_processRenew($dbh, {uid=>$uid, barcode=>$barcode,rnDate=>$dueDate});
    }
    $retVal->{'renewalStatusCode'} = "renewalStatusCode_0" . $renewStatus;
    return $retVal;
}

sub getRenewDueDate{
    
    my ($renewalPeriod, $duedate,$todayStr) = @_;
    my $retDate;
    my ($year,$month,$day,$hour,$min,$sec) = ($todayStr =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$/);
    return $retDate = date_getDeadLineDate($renewalPeriod, $todayStr);

}

