#!/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::Template_ajax qw(
    tmpl_read
    tmpl_write
);
use Opals::Search qw(
    srch_parseSearchTerm
    srch_searchRecord
    srch_zTab
);
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
);
my $dbh = Opals::Context->dbh();
my  $barcodeType =Opals::Context->preference('barcodeType');
END { $dbh->disconnect(); }

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

my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'ajax/search/searchJson.tmpl',
        }
);




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;

    }


    writeSortParam2tmpl($input);
    my $pSize = $input->{'pSize'};
    if(!defined $pSize || $pSize eq ''){
       $pSize =20;
    }
    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 $bcSearchList=[];
    my ($sf, $kw, $boolop) ;
    for (my $i = 0; $i < $iCount; $i++) {
        $sf     = 'sf' . $i;
        $kw     = 'kw' . $i;
        if($input->{$sf} eq '5000'){
            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'});
    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;
                           }
                       }
                   }
                   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'};
            }

    }


    $template->param(
        ARL_select      =>$ARL_select,
        numberOfHits    =>$resultSize,
        recordList      =>$result,
        bcSearchList    =>$bcSearchList,
    );

 

tmpl_write($dbh, $cgi, $cookie, $template);
#=======================================================
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);
    }

}

################################################################################
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 writeSortParam2tmpl{
    my ($input) =@_;
    my $sortAttr  = $input->{'sortAttr'};
    my $sortOrder = $input->{'sortOrder'};
    if(!$sortAttr &&  $input->{'sf0'} eq '5006'){
        $sortAttr=4;
    }
    if(! defined $sortOrder ){ $sortOrder =0;}
   $template->param(
    sortOrder           => $sortOrder,
    sortAttr            => $sortAttr,
    sortCallNum1st      => ($sortAttr == 5001)              ? 1 : 0,
    sort852c            => ($sortAttr == 8008)              ? 1 : 0,
    sortTitle           => ($sortAttr == 4)                 ? 1 : 0,
    sortAuthor          => ($sortAttr == 1003)              ? 1 : 0,
    sortPubDateSort     => ($sortAttr == 31)                ? 1 : 0,
    sortOrderReverse    => ($sortOrder && $sortOrder == 1)  ? 2 : 1,
    sortDown            => ($sortOrder && $sortOrder == 1)  ? 1 : 0,
    );



}



