#!/usr/bin/perl

use strict;
use CGI;

use Opals::Constant;
use Opals::Context;
use Opals::Circulation qw(
  circ_getItemStatus
  circ_getHoldListByRid
  circ_getReserveListByRid
);

use SIP::Map;
use SIP::Template;
use SIP::Session;
use SIP::Utility;

my $ITEM_CIRC_STATUS = {
  'other'                => 'OTHER',
  &IT_STAT_ON_ORDER      => 'ON_ORDER',
  &IT_STAT_FULL_AVAIL    => 'AVAILABLE',
  &IT_STAT_ONLOAN        => 'CHARGED',
  &IT_STAT_HAVE_RSVR     => 'CHARGED',
  &IT_STAT_OVERDUE       => 'CHARGED',
  &IT_STAT_IN_PROCESSING => 'IN_PROCESS',
  &IT_STAT_ONHOLD        => 'ON_HOLD_SHELF',
  &IT_STAT_CLAIM_RETURN  => 'CLAIMED_RETURN',
  &IT_STAT_LOST          => 'LOST',
  &IT_STAT_MISSING       => 'MISSING',
};

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

my $cgi = CGI->new;

# $cgi->param('aaa') returns an array of aaa
my $input = $cgi->Vars();

#my $op = $input->{'op'};
my $util = SIP::Utility->new();

my $template = SIP::Template->new(filename => 'item_information.tmpl',);

my $barcode              = $input->{'item_identifier'};
my $circulation_status   = $ITEM_CIRC_STATUS->{'other'};
my $security_marker      = 'NONE';
my $fee_type             = 'PROCESSING';
my $transaction_datetime = $util->now();
my $hold_queue_length    = 0;
my $due_date             = '';
my $hold_pickup_date;
my ($owner) = $dbh->selectrow_array(<<_SQL_);
select  val
from    opl_preference
where   var = 'libname'
_SQL_

my $session = SIP::Session->new(
  dbh             => $dbh,
  session_id      => $input->{'session_id'},
  item_identifier => $barcode
);
$session->validate(item_identifier => 1);

my $screen_message = $session->get('screen_message');
my $user           = $session->get('user');
my $record         = $session->get('record');

if ($session->isValid()) {
  my $itemCircStatus = circ_getItemStatus($dbh, $barcode);
  $circulation_status = getSIP2CirculationStatus($itemCircStatus->{'status'});

  my $rid         = $itemCircStatus->{'rid'};
  my $holdList    = circ_getHoldListByRid($dbh, $rid);
  my $reserveList = circ_getReserveListByRid($dbh, $rid);
  $hold_queue_length = scalar(@{$holdList}) + scalar(@{$reserveList});

  $due_date = $itemCircStatus->{'l_duedate'};

  foreach my $h (@{$holdList}) {
    if ($h->{'barcode'} eq '') {
      $hold_pickup_date = $util->format_datetime($h->{'dateExpiry'}, 'SIP');
      last;
    }
  }
}

my $response = {
  debug              => $session->get('debug'),
  circulation_status => $circulation_status,
  security_marker    => $security_marker,
  fee_type           => $fee_type,
  transaction_date   => $util->format_datetime($transaction_datetime, 'SIP'),
  item_identifier    => $barcode,
  title_identifier   => $record->{'title'},
  hold_queue_length  => $hold_queue_length,
  due_date           => $due_date,
  hold_pickup_date   => $hold_pickup_date,
  owner              => $owner,
  media_type         => SIP::Map::MAP->{ $record->{'type'} }->{'media_type'},
  screen_message     => $screen_message,
};

$template->param($response);

$template->write(cgi => $cgi);
################################################################################

sub getSIP2CirculationStatus {
  my ($status) = @_;

  ($ITEM_CIRC_STATUS->{$status}) || ($status = 'other');

  return $ITEM_CIRC_STATUS->{$status};
}
