#!/usr/bin/perl

use strict;
use CGI;

use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
);

use Time::localtime;

use Opals::Constant;

use Date::Calc qw(
    Add_Delta_DHMS
);

use Opals::Date qw(
    date_time_text
    date_getDeadLineDateTime
    date_getDeadLineDate

);
use Opals::User qw(
    user_getInformationById
);

use Opals::Eq_Circulation qw(

    circ_getItemInfo
    circ_getItemStatus
    circ_processRenew
);

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

my $cgi = CGI->new;
my $input = $cgi->Vars();
my ($permission, $cookieList, $template) = tmpl_read(
    {
        dbh             => $dbh,
        cgi             => $cgi,
        tmplFile        => 'eqmnt/renew.tmpl',
        reqPermission   => 'eq_circ_loan',
    }
);

my $tm = localtime;
my $todayStr = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday, $tm->hour, $tm->min, $tm->sec);

my $barcode     = $input->{'bc'};
my $cmdRenewCode = $input->{'cmdRenewCode'};
$barcode    =~ s/^\s+|\s+$//g;
my $uid;
my $dateDue;
my $dateDueFormat_text;
my $renewStatus;

if ($barcode ne ''){
    my $itemCircStatus  = circ_getItemStatus($dbh,{barcode=>$barcode});
    $uid                = $itemCircStatus->{'l_uid'};
    my $itemInfo        = circ_getItemInfo($dbh, $barcode, $uid);
    my ($userInfo, $guardian) = user_getInformationById($dbh, $uid);
    

    my $renewalPeriod = ($itemInfo->{'renewalPeriod'})? $itemInfo->{'renewalPeriod'}:0;
    
    #get seldate
    my $numb        = $input->{'rndateDue'};
    my $hourOrDay   = $input->{'rnhourOrDay'};

    my $renewDDType = $input->{'renewDDType'};
    if ($renewDDType =~ m/hour/i){
        my $num = $input->{'selHourDue'};
        $dateDue = formatStrDateDue($num, "h");
    }
    elsif($renewDDType =~ m/day/i){
        my $d_date = $input->{'d_date'}; 
        $dateDue = $d_date;
    }
    else {
        $dateDue = getRenewDueDate($renewalPeriod, $itemCircStatus->{'l_duedate'} ,$todayStr );
    }
    
    chomp($dateDue);
    $dateDueFormat_text =  date_time_text($dateDue, 1, 'en' );
    if ($cmdRenewCode && ($cmdRenewCode eq '01' || $cmdRenewCode eq '02')){
        $renewStatus = circ_processRenew($dbh, {uid=>$uid, barcode=>$barcode, rnDate=>$dateDue});
        getUserItemInfo($itemInfo,$userInfo, $barcode, $dateDue);
    }
    elsif ($itemCircStatus->{'status'} == IT_STAT_ONLOAN){
        getUserItemInfo($itemInfo, $userInfo, $barcode, $dateDue);
        if ($itemCircStatus->{'maxRenewal'} == 0){
            $template->param (renew_notAllowed =>1,);        }
        elsif ($itemCircStatus->{'renewalCount'} >= $itemCircStatus->{'maxRenewal'}){
            $template->param (renew_reachMax => 1,);    }
        elsif ($itemCircStatus->{'renewalCount'} < $itemCircStatus->{'maxRenewal'}){
            $renewStatus = circ_processRenew($dbh, {uid=>$uid, barcode=>$barcode, rnDate=>$dateDue}); }
    }
    else{
        if ($itemCircStatus->{'status'} == IT_STAT_NOEXIST){
            $template->param(itemnotExist => 1);        }
        elsif ($itemCircStatus->{'status'} == IT_STAT_HAVE_RSVR){
            getUserItemInfo($itemInfo,$userInfo,$barcode, $dateDue);
            $template->param(itemLoanButReserved=>1,);  }
        elsif($itemCircStatus->{'status'} != IT_STAT_ONLOAN){
            $template->param(itemNotOnLoan => 1);        }   
    }
    $template->param(
        renew_error => ($renewStatus==0)? 1 : 0,
        renew_Ok    => ($renewStatus==1)? 1 : 0,
        
    );
}
tmpl_write($dbh, $cgi, $cookieList, $template);

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

sub getUserItemInfo{
    my ($itemInfo, $userInfo,$barcode,$dateDue) = @_;
    $template->param(
        barcode         => $barcode,
        dateDue         => $dateDue,
        dateDueFormat_text => $dateDueFormat_text,
        #equipment name
        rname           => $itemInfo->{'rname'},
        #userInfo
        user_uid        => $userInfo->{'uid'},
        user_barcode    => $userInfo->{'userbarcode'},
        user_username   => $userInfo->{'username'},
        user_firstname  => $userInfo->{'firstname'},
        user_lastname   => $userInfo->{'lastname'},
        homeroom        => $userInfo->{'homeroom'},
        teacher         => $userInfo->{'teacher'},
        grade           => $userInfo->{'grade'},
        notes           => $userInfo->{'notes'},
    );
}


sub getItemDueDate{
    my($renewalPeriod) = @_;
    my $retDD = `date -d '$renewalPeriod hour' '+%Y-%m-%d %H:%M:%S'`;
    return $retDD;
}

sub getRenewDueDate{
    #my ($Dh, $duedate,$todayStr) = @_;
    my ($renewalPeriod, $duedate,$todayStr) = @_;
    my $retDate;
    #my ($year,$month,$day,$hour,$min,$sec) = ($duedate =~ /^(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$/);
    #my ($DYear, $DMonth,$DDay,$DHour,$DMin,$DSec) = Add_Delta_DHMS($year,$month,$day,$hour,$min,$sec, 0,$Dh,0,0);
    #$retDate = sprintf("%04d-%02d-%02d %02d:%02d:%02d" ,$DYear, $DMonth,$DDay,$DHour,$DMin,$DSec);
    #return $retDate;
    return $retDate = date_getDeadLineDate($renewalPeriod, $todayStr);

    
}

sub formatStrDateDue{
    my ($n,$h_d) = @_;
    my $retDD;
    return if ($n eq '' || $h_d eq '');
    if ($h_d eq 'd' ){
         $n = $n * 24;
    }
    $retDD = `date -d '$n hour' '+%Y-%m-%d %H:%M:%S'`;
    return $retDD;
}

