#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;    #use MARC::File::USMARC;

#use MARC::File::XML;

use Opals::Context;
use POSIX qw(
  ceil
);
use Opals::Circulation qw(
  circ_numItemsAvailable
  circ_getLoanListByRid
);
use Opals::BookingSystem qw(
  bs_numCopyBooked

);
use Opals::BookCover qw(
  bookCover_getUrl
  bookCover_amazon
  bookCover_google
  bookCover_syndetics

);
use Opals::SolrIndex qw(
  slr_search
  slr_buildSearchQuery
  slr_buildSearchQuery_ARL
);
use Opals::BarcodeMgmt qw(
  bcm_validateBc
);

use Opals::Session qw(
  SessionHdl_add
  SessionHdl_exist_bc
);
use JSON;
my $dbh         = Opals::Context->dbh();
my $barcodeType = Opals::Context->preference('barcodeType');
END { $dbh->disconnect(); }
my $input=getInput();  ##Ha
#open debug,">/tmp/aa"; print debug "$input->{'kw0'}\n"; close debug;
my $cgi   = CGI->new;
#Ha my $input = $cgi->Vars();


my $zid = $input->{'zid'};
($zid && $zid =~ m/^[\d]+$/ && $zid >= 0) || ($zid = 0);

my ($sfOrder, $kw, $boolop);
my @sInput;

my $sortOrder = $input->{'sortOrder'};
my $sortAttr  = $input->{'sortAttr'};
$sortAttr = undef if ($zid != 0);
if (!$sortAttr) {
  $sortAttr  = 31;
  $sortOrder = 2;

}

my $pSize = $input->{'pSize'};
if (!defined $pSize || $pSize eq '') {
  $pSize = 20;
}
my $callBackFn = $input->{'callbackFn'}||"callBackFn";
my $curPage = $input->{'pNum'};
($curPage && $curPage >= 1) || ($curPage = 1);
my $offset = ($curPage - 1) * $pSize + $ENV{'Z_INDEX_BASE'};
my $from   = $input->{'dateTimeFrom'};
my $to     = $input->{'dateTimeTo'};
my ($resultSize, $result);

my $AR_prgm   = $input->{'program'};
my $recFormat = $input->{'recFormat'};
$recFormat = 'detail' if ($recFormat eq '');
my $ARL_select = 0;
if (defined $AR_prgm && $AR_prgm ne '') {
  $ARL_select = 1;
}
my @recType = $cgi->param('recType');
my $filter;
$filter->{'recType'} = \@recType;

my $iCount = 0;
foreach my $cgiInput (keys %$input) {
  $iCount++ if ($cgiInput =~ m/^sf/);
}

my $nofSrch      = 0;
my $bcSearchList = [];
my ($sf, $kw, $boolop);
for (my $i = 0 ; $i < $iCount ; $i++) {
  $sf = 'sf' . $i;
  $kw = 'kw' . $i;
  $nofSrch++ if ($input->{$kw} ne '');
  if ($input->{$sf} eq '5000' && $input->{$kw} ne "") {
    if ($barcodeType > 0) {
      $input->{$kw} = bcm_validateBc($dbh, $input->{$kw}, $barcodeType);
    }
    push @$bcSearchList, { bc => $input->{$kw} };
  }

}

my $rs = searchSolr($input, $filter);
($resultSize, $result) = ($rs->{'hits'}, $rs->{'recordList'});
my $ssVar = $input->{'ssVar'};
my $ssid  = $cgi->cookie('globalSessionID');
if ($resultSize > 0) {
  getBookCover($result);
  foreach my $record (@$result) {
    my $numOfCopyAvbl = circ_numItemsAvailable($dbh, $record->{'rid'}, $from);
    my $numBookedItem = bs_numCopyBooked($dbh, $record->{'rid'}, 1, $from, $to);
    $record->{'numAvailable'} = $numOfCopyAvbl - $numBookedItem;
    my $loanItems = circ_getLoanListByRid($dbh, $record->{'rid'});
    foreach my $l (@$loanItems) {
      foreach my $item (@{ $record->{'itemList'} }) {
        if ($l->{'barcode'} eq $item->{'barcode'}) {
          $item->{'loanTo'}  = $l->{'uid'};
          $item->{'dueDate'} = $l->{'dateDue'};
          last;
        }
      }
    }
    foreach my $item (@{ $record->{'itemList'} }) {
        ($item->{'circStats'})=$dbh->selectrow_array("select circStats from opl_item where barcode=?",undef,$item->{'barcode'});
    }
    my $isbnList = $record->{'isbn'};
    $record->{'isbnList'} = "";
    if (defined $isbnList && scalar(@$isbnList) > 0) {
      foreach my $isbnItem (@$isbnList) {
        $record->{'isbnList'} .= "," if ($record->{'isbnList'} ne '');
        $record->{'isbnList'} .= $isbnItem->{'item'};
      }
    }
    my $itemAvailability = getItemAvailability($dbh, $record->{'itemList'});

    #---- ARL -----
    my @arInfo;
    foreach my $ar (@{ $record->{'ARinfo'} }) {
      if ($ar->{'program'} =~ m/$AR_prgm/gi) {
        push @arInfo, $ar;
      }
      $record->{'ARinfo'} = \@arInfo;
    }
    my $ar = $record->{'ARinfo'};
  }    #END:foreach my $record (@$result)

  #Wed, Nov 28, 2012 @ 15:31:08 EST
  # CASE: scan barcode and automatically add into table session
  #

}

my $rs={
  ARL_select   => $ARL_select,
  numberOfHits => $resultSize,
  recordList   => $result,
  bcSearchList => $bcSearchList
  };
 
 syncBcInSession($dbh,$rs);
 print "Content-type: text/plain\n\n";
  print   "$callBackFn(" . to_json($rs,{pretty=>1}) .")";
#=======================================================
sub syncBcInSession {
  my ($dbh,$rs) = @_;

  if ($nofSrch == 1 && scalar(@$bcSearchList) == 1 && $ssVar eq 'delExpHitlist')
  {
    my $record = @$result[0];
    my $bc     = @$bcSearchList[0]->{'bc'};
    SessionHdl_add($dbh, $ssid, $ssVar, $record->{'rid'}, $bc, '');
      $rs->{'added_bc'}= $bc;
      $rs->{'added_rid'}= $record->{'rid'};
      $rs->{'added_title'}= $record->{'title'};
  }
  foreach my $record (@$result) {
    foreach my $item (@{ $record->{'itemList'} }) {
      if (SessionHdl_exist_bc($dbh, $ssid, $ssVar, $item->{'barcode'})) {
        $item->{'selected'} = 1;
      }
    }
  }
}

#=======================================================
sub getBookCover {
  my ($recList)    = @_;
  my $awsId        = Opals::Context->preference('amazonId');
  my $awsSecretKey = Opals::Context->preference('amazonSecreteKey');
  my $syndeticsId  = Opals::Context->preference('syndeticsId');
  if ($syndeticsId ne '') {
    bookCover_syndetics($recList);
  }
  elsif ($awsId ne '' && $awsSecretKey ne '') {
    bookCover_amazon($recList, $awsId, $awsSecretKey);
  }
  else {
    bookCover_google($recList, "m");
  }

}

################################################################################
sub getItemAvailability {
  my ($dbh, $itemList) = @_;
  my $sth = $dbh->prepare(
'select status from opl_itemstatus where barcode=? order by ondate desc limit 1'
  );
  foreach my $item (@$itemList) {
    $sth->execute($item->{'barcode'});
    if (my ($s) = $sth->fetchrow_array) {
      $item->{'status'} = $s;
    }
    else {
      $item->{'status'} = 1;
    }
  }
}
################################################################################
sub folletize {
  my ($bc) = @_;
  $bc =~ s/^T|^t//g;
  $bc =~ s/^0+//g;
  $bc = 'T' . substr("0000000$bc", -7);
  return $bc;
}

################################################################################
sub deSpectrumize {
  my ($bc) = @_;
  if (length($bc) != 14) {
    return $bc;
  }
  $bc = substr $bc, 5, 8;
  $bc =~ s/^0+//g;
  return $bc;
}

#=======================================================
sub searchSolr {
  my ($input, $filter) = @_;
  my $lQuery = slr_buildSearchQuery($input, $filter);
  my $rs = undef;
  if ($lQuery ne '') {
    $rs = slr_search(
      {
        lQuery        => $lQuery,
        recFormat     => 'detail',
        sortAttr      => $sortAttr,
        sortDir       => $sortOrder,
        offset        => $offset,
        size          => $pSize,
        incCircStatus => 1
      }
    );
  }
  return $rs;
}

################################################################################

# Fri, Oct 24, 2008 @ 09:16:19 EDT

sub getInput{
    my $request={};
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        my $json ="";
        while (<STDIN>) {
            $json .= $_;
        }
       $request = decode_json($json);
    }
    return $request;
}

