#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::Context;
use Opals::Constant;
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);

use Opals::Circulation qw(
    circ_getRecInfo
    circ_getUserCircStatus
    eCirc_processReserve
    circ_getItemStatus
    eCirc_getUserReserveList
    );
use Opals::Date qw(
    date_now
    date_getDeadLineDate
);
use Opals::User qw(
    user_currentUser
);

use Opals::Ebook qw(
    eb_getMarcXmlRid
);



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/eReserve.tmpl',
        }
);
my $todayStr = date_now();
my $uid       = 1;
my $bid       = $input->{'bid'};
my $rid       = 0;
my $barcode   = undef;  
my ($errCode, $cookie, $user) = user_currentUser($dbh, $cgi);
my $userStatus      = undef;
my $itemCircStatus  = {status=>IT_STAT_NOEXIST};
my $recInfo         = {reservePeriod=>0};
if($errCode==0 && $user->{'uid'}>0){
    $uid        = $user->{'uid'};
    $userStatus = circ_getUserCircStatus($dbh,$uid);
    my $userMsgCode  = getMsgCode_user($userStatus,$user);

    if (defined $bid && $bid>0) {
         $barcode= getBarcodeEbook($dbh,$bid);
        if(defined $barcode && $barcode ne""){
            $itemCircStatus  = circ_getItemStatus($dbh, $barcode);
        }

        $rid        = eb_getMarcXmlRid($dbh,$bid);
        $recInfo    = circ_getRecInfo($dbh, $rid, $uid);
    }
    my $itemMsgCode   = getMsgCode_item($itemCircStatus,$bid);
    my $reserveId     = 0;
    my $statusProcess = 0;
    my $dateExpiry    = "";
    #userMsgCode: status|overdue|maxLoan|maxRenew|maxReserve|hasUserEmail}
    if ($userMsgCode eq "100001" && $itemMsgCode eq "10"){
        my $reservePeriod   = $recInfo->{'reservePeriod'};
        $dateExpiry         = date_getDeadLineDate($reservePeriod, $todayStr);
        $reserveId          = eCirc_processReserve($dbh, $uid,$bid, $todayStr, $dateExpiry);
        $statusProcess = ($reserveId>0)?1:0; 
    }
    
    
    $template->param(
            status      => $statusProcess,
            reserveId   => $reserveId,
            dateExpiry  => $dateExpiry,
            rid         => $recInfo->{'rid'},
            title       => $recInfo->{'title'},
            author      => $recInfo->{'author'},
            uid         => $uid,
            bid         => $bid,
            userMsgCode => $userMsgCode,
            itemMsgCode => $itemMsgCode
    );
} 
tmpl_write($dbh, $cgi, $cookie, $template);

#-------------------------------------------------------------------------------------------
sub getBarcodeEbook{
    my($dbh,$bid)=@_;
    my $sth=$dbh->prepare("select i.barcode from opl_item i inner join opl_ridBid e using(rid) where e.bid=? limit 1");
    $sth->execute($bid);
    my ($barcode ) = $sth->fetchrow_array;
    return $barcode eq '0E0'? undef:$barcode;
}

#-------------------------------------------------------------------------------------------
sub getMsgCode_user{
    my($userStatus,$user)=@_;
    $userStatus->{'hasUserEmail'} = ($user->{"email"} ne "" )? 1:0 ;
    return $userStatus->{'status'}.$userStatus->{'overdue'}.$userStatus->{'maxLoan'}.$userStatus->{'maxRenew'}.$userStatus->{'maxReserve'}.$userStatus->{"hasUserEmail"};
}
#-------------------------------------------------------------------------------------------
sub getMsgCode_item{
    my ($itemCircStatus,$bid)=@_;
    my $ebReserveList = eCirc_getUserReserveList($dbh,$uid);
    my $isReserved    = 0;
    foreach my $rec (@$ebReserveList){
        if($rec->{'bid'} eq $bid){
            $isReserved =1;
            last;
        }
    }
    my $retCode="";
    if($itemCircStatus->{'status'}==IT_STAT_NOEXIST){
        $retCode="06";    }
    elsif($itemCircStatus->{'status'}==IT_STAT_ONLOAN && $isReserved>0){
        $retCode="07";    }    
    else{ # fully available
        $retCode="10";    }

    return $retCode;     
}
