#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use POSIX qw(
  strftime
);

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/util/item-info.tmpl',

    #    reqPermission => 'circ_loan|circ_return',
  }
);
my $syspref    = tmpl_preference($dbh);
my $chargeFine = $syspref->{'charge_overdue'};
my $todayStr   = strftime('%F %T', localtime);
my $dLast      = Opals::Context->preference('dateLast');
my $msgCode    = 1;

my @cookieList  = (@$cookie);
my $validateBc  = $syspref->{'validateBarcode'};
my $barcodeType = $syspref->{'barcodeType'};
$barcode =~ s/^\s+|\s+$//g;

if ($validateBc eq '1') {
  $barcode = bcm_validateBc($dbh, $barcode, $barcodeType);
}

if ($barcode ne '') {
  my $uid = $input->{"uid"};
  my $itemInfo = circ_getItemInfo($dbh, $barcode, $uid);

  my $itemCircStatus = circ_getItemStatus($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) {
    if (@holdList && scalar(@holdList) > 0) {
      $msgCode = 9;
      $template->param(holdList => \@holdList,);
    }
  }
  elsif (!$itemCircStatus->{'l_idloan'} || $itemCircStatus->{'l_idloan'} == 0) {
    $msgCode = 3;
  }

  $template->param(
    msgCode     => $msgCode,
    barcode     => $barcode,
    reserveList => \@reserveList,
  );

  if ($itemCircStatus->{'status'} != IT_STAT_NOEXIST) {
    $template->param(
      rid          => $itemInfo->{'rid'},
      title        => $itemInfo->{'title'},
      author       => $itemInfo->{'author'},
      pubName      => $itemInfo->{'pubName'},
      pubDate      => $itemInfo->{'pubDate'},
      price        => $itemInfo->{'price'},
      callNumber   => $itemInfo->{'callNumber'},
      maxRenewal   => $itemInfo->{'maxRenewal'},
      isTempILL    => $itemCircStatus->{'isTempILL'},
      l_uid        => $itemCircStatus->{'l_uid'},
      l_idloan     => $itemCircStatus->{'l_idloan'},
      l_dateLoan   => $itemCircStatus->{'l_dateLoan'},
      l_duedate    => $itemCircStatus->{'l_duedate'},
      l_maxRenewal => $itemCircStatus->{'l_maxRenewal'},
      renewalCount => $itemCircStatus->{'renewalCount'},
      isOverdue    =>($itemCircStatus->{'l_duedate'} lt $todayStr) ? 1:0,
    );
  }

  if ($itemCircStatus->{'status'} == IT_STAT_HAVE_RSVR) {
    $template->param(isReserved => 1);
  }
}

tmpl_write($dbh, $cgi, $cookie, $template, 'application/json');
