#!/usr/bin/perl

=item
Files added/modified for renewal script:
 - bin/circ/renew
 - htdocs/theme/opals/circ/renew.tmpl
 - htdocs/theme/opals/header.inc
 - module/Opals/Template.pm
=cut
#use utf8;
use strict;
use CGI;

use Opals::Context;
use Date::Calc::Object qw(
    :all
);
use POSIX qw(
    floor
);
use Time::localtime;

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

use Opals::Circulation qw(
    circ_getItemStatus
    circ_getItemInfo
    circ_processRenew
    Circ_validateFollettBarcode
    Circ_validateSpectrumBarcode
    Circ_validateLeadingZeroBc
);
use Opals::Date qw(
    date_parse
    date_today
    date_text
    date_validateWorkday
    date_deltaWorkDay
    date_addDeltaWorkday
);
use Opals::User qw(
    user_category
    user_list
    user_getInformationById
    user_balance
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
################################################################################
sub getDeadLineDate{
    my ($lengthDay,$dateStr)= @_;
    my $retDate;
    
    my $ddate = date_parse($dateStr);
    return $dateStr if($lengthDay<=0);
    $ddate = date_today() unless ($ddate);
    $ddate = date_addDeltaWorkday($ddate, $lengthDay);
    $ddate = date_validateWorkday($ddate,$lengthDay);
    my ($year,$month,$day) = $ddate->date();
    $retDate = sprintf("%04d-%02d-%02d 23:59:59",$year,$month,$day);
    return $retDate;
}

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


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

if ($permission && $permission->{'circ_loan'}) {
    my $barcode = $input->{'bc'};
    my $inDueDate  = $input->{'rnduedate'};  
    my $cmdRenewCode = $input->{'cmdRenewCode'};  #Ha
    my $validateBc = $syspref->{'validateBarcode'}; 
    my $barcodeType = $syspref->{'barcodeType'}; 
    my $circulationSound = $syspref->{'circulationSound'}; 

    my $uid;
    $barcode    =~ s/^\s+|\s+$//g;
    $barcode= validateBc($dbh,$barcode,$barcodeType) if($validateBc eq '1');
     
    my $renewStatus =0;
  
    if ($barcode ne '') {    
        my $itemCircStatus = circ_getItemStatus($dbh,$barcode);
        $uid               = $itemCircStatus->{'l_uid'};
        my $itemInfo       = circ_getItemInfo($dbh, $barcode, $uid);
        my ($userInfo, $guardian) = user_getInformationById($dbh, $uid);
        $dateDue  = ($inDueDate ne '')? "$inDueDate 23:59:59" : getDeadLineDate($itemInfo->{'renewalPeriod'},$todayStr);
        
        # cmdRenewCode
        # CASE 1: renewal reaches max allowance.
        # CASE 2: Override block to renewal this item since this item has reserve for some one

        if($cmdRenewCode 
            && ($cmdRenewCode eq '01'|| $cmdRenewCode eq '02')){
                 $renewStatus = circ_processRenew($dbh,$uid,$barcode,$dateDue);
                 getUserItemInfo($itemInfo ,$userInfo,$barcode,$dateDue);
         }
                 
        elsif($itemCircStatus->{'status'}==IT_STAT_ONLOAN){
            getUserItemInfo($itemInfo ,$userInfo,$barcode,$dateDue);
            if($itemCircStatus->{'maxRenewal'}==0){
                    $template->param(
                        renew_notAlowed =>1,);
              }
            elsif($itemCircStatus->{'renewalCount'} >= $itemCircStatus->{'maxRenewal'}){
                    $template->param(                        
                        renew_reachMax =>1,);
               }

            elsif($itemCircStatus->{'renewalCount'} < $itemCircStatus->{'maxRenewal'}){
                $renewStatus = circ_processRenew($dbh,$uid,$barcode,$dateDue);
            }
        }#if($itemCircStatus->{'status'}==IT_STAT_ONLOAN)
        else{

                if($itemCircStatus->{'status'}==IT_STAT_NOEXIST){
                    $template->param(
                        itemNotExist =>1,);
                }
                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
                    
                    getUserItemInfo($itemInfo ,$userInfo,$barcode,$dateDue);         
                    $template->param(
                        itemLoanButReserved=>1,
                    );
                }
                elsif ($itemCircStatus->{'status'} != IT_STAT_ONLOAN) {
                    $template->param(
                        itemNotOnLoan =>1,);
                }
                           

       } #else if($itemCircStatus->{'status'}==IT_STAT_ONLOAN)     
       
        $template->param(
             renew_error  => ($renewStatus==0)? 1 : 0, 
             renew_OK     => ($renewStatus==1)? 1 : 0,             
        );
        
     }#if ($barcode ne '')
     
     if($circulationSound){
        $template->param(circSound     =>1); 
    }
}
$template->param(circulation =>1,
                 hlpUrl      => Opals::Constant->getHlpUrl('renew')
                 );

my $msgValMap={renew_msg06=>{dueDate=>$dateDue}};
my $renewMsgMap =loc_getMsgFile('circ/renewPanel.msg',$msgValMap);
    loc_write($template,$renewMsgMap);

tmpl_write($dbh, $cgi, $cookieList, $template);
#########################################################################

sub doRenewal{
    my ($dbh, $barcode) = @_;

}
#########################################################################

sub validateBc{
    my($dbh,$barcode,$barcodeType) =@_;
   if($barcodeType eq '1'){#follett
        $barcode  = Circ_validateFollettBarcode($dbh,$barcode );
    }
    elsif($barcodeType eq '2'){#spectrum
        $barcode  = Circ_validateSpectrumBarcode($dbh,$barcode );
    }
    elsif($barcodeType eq '3'){#leading zero
        $barcode  = Circ_validateLeadingZeroBc($dbh,$barcode );
    }

    #else{#follett
    #    $barcode  = Circ_validateFollettBarcode($dbh,$barcode );
    #}
    return $barcode;
   
}

#########################################################################
sub getUserItemInfo{
    my ($itemInfo ,$userInfo,$barcode,$dateDue)=@_;
     my $dateStr= substr $dateDue,0,10;
     $template->param(
         barcode         => $barcode,
         dateDue         => $dateStr,

    #Item Info
        holding_title    => $itemInfo->{'title'},
        holding_author   => $itemInfo->{'author'},
        holding_pubName  => $itemInfo->{'pubName'},
        holding_pubDate  => $itemInfo->{'pubDate'},

    #User Info
        user_firstname   => $userInfo->{'firstname'},
        user_lastname    => $userInfo->{'lastname'},
        user_addrLine1   => $userInfo->{'addrLine1'},
        user_addrLine2   => $userInfo->{'addrLine2'},
        user_city        => $userInfo->{'city'},
        user_state       => $userInfo->{'state'},
        user_zip         => $userInfo->{'zip'},
        user_phone       => $userInfo->{'phone'},
        user_email       => $userInfo->{'email'},
        user_username    => $userInfo->{'username'},
        user_userbarcode => $userInfo->{'userbarcode'},
        user_uid         => $userInfo->{'uid'},
    );
            

}
#########################################################################
#$dbh->disconnect();
