#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

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


use Opals::Circulation qw(
    circ_numItemsAvailable
    circ_getLoanListByRid
    Circ_validateFollettBarcode
    Circ_validateSpectrumBarcode
    Circ_validateLeadingZeroBc
);

use Opals::Utility qw(
    util_escapeXml
);


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

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

my $cgi = CGI->new;
my $input = $cgi->Vars();

my ($resultSize, $result) ;

   my $rs = undef;
   $rs = searchSolr($input);
   $resultSize=$rs->{'hits'};
   $result    = $rs->{'recordList'};

    my $recReturned= scalar(@$result);
    my $retStr   ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<collection numberOfHits=\"$resultSize\" recordReturned=\"$recReturned\" >\n";
    $retStr .=createRequestXml($input);
    
    foreach my $record (@$result) { 
        $record =~ s/<\?xml.*>//;           
        if($record =~ m/<controlfield tag=\"001\">(.*)<\/controlfield>/gi){
            my $circInfoXml=getRecCircInfoXml($dbh,$1);
            $record  =~ s/<\/record>//gi;
            $record  =~ s/<subfield code="-">(.*)<\/subfield>//g;
            $record .=  "$circInfoXml\n</record>\n";
        }
        $retStr .=$record;
    }
    $retStr .="</collection>";


print "Content-type: text/xml\n\n";
print $retStr;

     
################################################################################
    
sub getRecCircInfoXml{
    my($dbh,$rid)=@_;
    my $circInfoXml="";
    my $numAvailable =circ_numItemsAvailable($dbh,$rid);
    my $loanList = circ_getLoanListByRid($dbh,$rid);

    $circInfoXml ="<circInfo>";
    $circInfoXml .="<available>$numAvailable</available>";
    
    foreach my $loan(@$loanList){
       $circInfoXml .= "<loan><barcode>" .$loan->{'barcode'} ."</barcode>".
                       "<due>" . $loan->{'dateDue'}  ."</due></loan>";
    }
    $circInfoXml .= "</circInfo>";
    return $circInfoXml;

}


################################################################################
sub searchSolr{
    my($input)=@_;
    my $rs=undef;
    my $sortAttr  = $input->{'sortAttr'};
    my $sortOrder = $input->{'sortOrder'};
    if(!$sortAttr &&  $input->{'sf0'} eq '5006'){
        $sortAttr=4;
    }
    if($input->{'sf0'} eq '5000' && $barcodeType>0 && $barcodeType<5){
        $input->{'kw0'}= bcm_validateBc($dbh,$input->{'kw0'},$barcodeType);
    }
    
    my $pSize = 20;
    my $curPage = $input->{'pNum'};
    ($curPage && $curPage >= 1) || ($curPage = 1);
    my $offset = ($curPage - 1) * $pSize;

    my $lQuery=($input->{'notContain'} eq 1)?slr_buildSearchQuery_notContain($input)
                                            :slr_buildSearchQuery($input);
    my $param={lQuery=>$lQuery,recFormat=>'marcXml',
                             sortAttr=>$sortAttr,sortDir=>$sortOrder,
                             offset=>$offset,size=>$pSize,
                             incCircStatus=>0};
                                         
    if($lQuery ne ''){
        $rs = slr_search($param);  
    }
    return $rs;
                                        
}
################################################################################
sub createRequestXml{
    my($input)=@_;
    my $iCount = 0;
    foreach my $cgiInput (keys %$input) {
        $iCount++ if ($cgiInput =~ m/^sf/);
    }
    my $sortAttr  = $input->{'sortAttr'};
    my $sortOrder = $input->{'sortOrder'};
    if(!$sortAttr &&  $input->{'sf0'} eq '5006'){
        $sortAttr=4;
    }
    my $pSize = 20;
    my $curPage = $input->{'pNum'};
    ($curPage && $curPage >= 1) || ($curPage = 1);
    
    my $requestXml="";
    $requestXml .="<request>\n";        
    $requestXml .="<page>$curPage</page>\n";
    $requestXml .="<sortAttr>$sortAttr</sortAttr>\n";
    $requestXml .="<sortOrder>$sortOrder</sortOrder>\n";
    
    if($input->{'notContain'} eq 1){
        $requestXml .="<notContain subField=\"" . $input->{'sf0'} . "\"></notContain>\n";
    }
    else{
        my ($sfOrder, $kw, $boolop);
        for (my $i = 0; $i < $iCount; $i++) {
            $sfOrder= 'sf' . $i;
            $kw     = 'kw' . $i;
            $boolop = 'boolop' . $i;
            if($input->{$sfOrder} eq '5000' && $barcodeType>0 && $barcodeType<5){
                $input->{$kw}= bcm_validateBc($dbh,$input->{'kw0'},$barcodeType);
            }
            $requestXml .="<term searchField=\"". $input->{$sfOrder} . "\" boolean=\"" . $input->{$boolop}. "\">"
             . util_escapeXml($input->{$kw}) ."</term>\n";

        }
    }

   $requestXml .="</request>\n";
   return $requestXml;
}
 
################################################################################



