#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Time::localtime;
use Opals::Context;
use Opals::Template qw(
  tmpl_read
  tmpl_write
  tmpl_preference
);

use Opals::User qw(
  user_getInformationById
  user_isUserBc
);
use Opals::Circulation qw(
  circ_getItemStatus
  circ_getItemInfo
  Circ_validateFollettBarcode
  Circ_validateSpectrumBarcode
  Circ_validateLeadingZeroBc
);
use Opals::BarcodeMgmt qw(
  bcm_validateBc
);

use Opals::Constant;

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

my $cgi     = CGI->new;
my $input   = $cgi->Vars();
my $barcode = $input->{"barcode"};
my ($permission, $cookie, $template) = tmpl_read(
  {
    dbh           => $dbh,
    cgi           => $cgi,
    tmplFile      => 'ajax/circ/loanInfo.tmpl',
    reqPermission => 'circ_loan|circ_return',
  }
);
my $syspref    = tmpl_preference($dbh);
my $chargeFine = $syspref->{'charge_overdue'};
my $loginuid   = $template->param('curUserId');
my $tm         = localtime;
my $todayStr =
  sprintf("%04d-%02d-%02d", $tm->year + 1900, ($tm->mon) + 1, $tm->mday);
my $dLast   = Opals::Context->preference('dateLast');
my $msgCode = 1;

my @cookieList = (@$cookie);
if ( $permission && $permission->{'circ_loan'}
  || $permission && $permission->{'circ_return'})
{
  my $validateBc  = $syspref->{'validateBarcode'};
  my $barcodeType = $syspref->{'barcodeType'};
  $barcode =~ s/^\s+|\s+$//g;
  $barcode = bcm_validateBc($dbh, $barcode, $barcodeType)
    if ($validateBc eq '1');

  if ($barcode ne '') {
    my $itemCircStatus = circ_getItemStatus($dbh, $barcode);
    my $itemInfo = circ_getItemInfo($dbh, $barcode);

    my $reserveList = $itemCircStatus->{'reserveList'};
    my $holdList    = $itemCircStatus->{'holdList'};

    if ($itemCircStatus->{'status'} == IT_STAT_NOEXIST) {
      my $tmpUid = user_isUserBc($dbh, $barcode);
      if ($tmpUid > 0) {
        $msgCode = '4';
      }
      else {
        $msgCode = '2';
      }

    }
    elsif ($itemCircStatus->{'status'} == IT_STAT_LOST) {
      $msgCode = '5';
    }
    elsif ($itemCircStatus->{'status'} == IT_STAT_MISSING) {
      $msgCode = '6';
    }
    elsif ($itemCircStatus->{'status'} == IT_STAT_CLAIM_NEVER_LOAN) {
      $msgCode = '7';
    }
    elsif ($itemCircStatus->{'status'} == IT_STAT_CLAIM_RETURN) {
      $msgCode = '8';
    }
    elsif ($itemCircStatus->{'status'} == IT_STAT_ONHOLD) {

      #Tue, Mar 01, 2016 @ 10:20:59 EST
      if ($holdList && scalar(@$holdList) > 0) {
        $msgCode = '9';
        $template->param(
          holdList     => $holdList,
          h_title      => $itemInfo->{'title'},
          h_author     => $itemInfo->{'author'},
          h_pubName    => $itemInfo->{'pubName'},
          h_pubDate    => $itemInfo->{'pubDate'},
          h_price      => $itemInfo->{'price'},
          h_callNumber => $itemInfo->{'callNumber'}
        );
      }
    }
    elsif (!$itemCircStatus->{'l_idloan'} || $itemCircStatus->{'l_idloan'} == 0)
    {
      $msgCode = '3';
    }
    $template->param(
      msgCode => $msgCode,
      barcode => $barcode
    );
    if ($itemCircStatus->{'status'} != IT_STAT_NOEXIST) {
      $template->param(
        rid          => $itemInfo->{'rid'},
        l_uid        => $itemCircStatus->{'l_uid'},
        l_idloan     => $itemCircStatus->{'l_idloan'},
        l_title      => $itemInfo->{'title'},
        l_author     => $itemInfo->{'author'},
        l_pubName    => $itemInfo->{'pubName'},
        l_pubDate    => $itemInfo->{'pubDate'},
        l_price      => $itemInfo->{'price'},
        l_callNumber => $itemInfo->{'callNumber'},
        l_dateLoan   => $itemCircStatus->{'l_dateLoan'},
        l_duedate    => $itemCircStatus->{'l_duedate'},
        isTempILL    => $itemCircStatus->{'isTempILL'},
      );
    }
    if ($itemCircStatus->{'status'} == IT_STAT_HAVE_RSVR) {
      $template->param(isReserved => 1);
    }
  }

}
tmpl_write($dbh, $cgi, $cookie, $template);

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

