#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

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

use POSIX qw(
    ceil
    floor
);
use Opals::Template qw(
    tmpl_rangedPageList
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::MarcXmlParser;
use Opals::SolrIndex qw(
    slr_search
    slr_buildSearchQuery
    slr_getSuggestion
);
use Opals::RecordInfoHTML qw(
    rinfo_getPageNavForm_search
);
use Opals::Search qw(
    srch_buildPQF_owl
);
use Opals::BookCover qw(
    bookCover_getUrl
    bookCover_amazon
    bookCover_google
    bookCover_syndetics
);
use Opals::Rating qw(
    cmntRating_getAvgRating
    cmntRating_numOfRating
);

use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }

my $cgi = CGI->new;
my $input = $cgi->Vars();
my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'search/bgnrSrch/srchRs.tmpl',
        }
);
my @cookieList = (@$cookie);
my $zid = $input->{'zid'};
($zid && $zid >= 0) || ($zid = 0);

my  $showLocation =Opals::Context->preference('showLocation');

my ($sfOrder, $kw, $boolop);
my @sInput;
my ( $pqf, $sTerm);
my $iCount = 0;

($input->{'sf0'}) || ($input->{'sf0'} = 1016);
my $iCount = 0;
foreach my $cgiInput (keys %$input) {
    $iCount++ if ($cgiInput =~ m/^sf/);
}
for (my $i = 0; $i < $iCount; $i++) {
    $sfOrder= 'sf' . $i;
    $kw     = 'kw' . $i;
    $boolop = 'boolop' . $i;
    push @sInput, {
        iOrder  => "$i",
        sOrder  => "$input->{$sfOrder}",
        sKw     => "$input->{$kw}",
        sBool   => "or",
    };
}
$template->param(sInput => \@sInput,
                 );


writeSortParam2tmpl($input);
my $pageNavForm =rinfo_getPageNavForm_search($cgi);
    $template->param(pageNavForm=>$pageNavForm);
    my $formatMsgMap  =loc_getMsgFile('search/facet.msg',{});
    my  $lang = $cgi->cookie('language');
        if($lang !~ m/en|fr/i){
        $lang          = 'en';
    }
    my $pref = tmpl_preference($dbh);
    my $pSize = 15;
    my $curPage = $input->{'pNum'};
    ($curPage && $curPage >= 1) || ($curPage = 1);
    my $offset = ($curPage - 1) * $pSize; 
  
    my $sortAttr    = $input->{'sortAttr'};
    my $sortOrder   = $input->{'sortOrder'};
    if((!defined $sortOrder || $sortOrder eq '' ) && $sortAttr eq 31){ $sortOrder =1;}
    my $rs=undef;
       $rs = search_localDb();
    my ($hits,$recList) = ($rs->{'hits'},$rs->{'recordList'});

       if($hits >0){
        getBookCover($recList);
        getRating($recList);
        if ($hits - $offset + 1 <= 0) {
            my $availRange = $hits % $pSize;
            $availRange = $pSize if ($availRange == 0); 
            $offset = $hits - $availRange + 1;
            $curPage = ($offset - 1) / $pSize + 1;
        }
        my $recRsPos =$offset;                
        my $bkShelfMidCallno="";
        my $bkShelfMidRecId=0;
        my $bkShelfLocation=$pref->{'OWLsrchLocation'};
        foreach my $rec(@$recList){
            $rec->{'callnumber'} =~ s/[\s]+/<br>/g; 
            $rec->{'recRsPos'}=$recRsPos++; 
            if($bkShelfMidCallno eq '' && $rec->{'callNum1St'} ne '' ){
                $bkShelfMidCallno = $rec->{'callNum1St'};
                $bkShelfMidRecId = $rec->{'rid'};
            }   
            $rec->{'callNum1St'} =~ s/ +/<br>/g;
          
        }

        my $pRange = 10;
        my @rangedPageList = tmpl_rangedPageList($hits, $curPage, $pSize, $pRange);
        my $recTo =  $offset  + $pSize ;
        if($recTo > $hits) {
            $recTo = $hits;
        }
        $template->param(
            bkShelfMidCallno    =>$bkShelfMidCallno,
            bkShelfMidRecId     =>$bkShelfMidRecId,
            bkShelfLocation     =>$bkShelfLocation,
            rs                  => $recList,
            rangedPageList      => \@rangedPageList,
            hits                => $hits,
            pNum                => $curPage,
            recFrom             => $offset +1,
            recTo               => $recTo ,
            "sortAttr_$sortAttr"=>1 , 
            showLocation        =>($showLocation eq '1')?1:0,
        );
         foreach my $var qw(facet generalInfo inclCircData studentILL){
            if(defined $rs->{$var}){
                $template->param($var=>$rs->{$var});
            }
        }
    }
    else{
        $template->param(
            suggestion=>$rs->{'suggestion'}->{'term'}  ,
            sugField  =>$rs->{'suggestion'}->{'field'}
        );
    }


   

tmpl_write($dbh, $cgi, \@cookieList, $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 getRating{
    my ($recList)=@_;
    my  $rating =Opals::Context->preference('rating');
    if($rating && $rating ==2 ){
        foreach my $rec(@$recList){
            my $noReview  = cmntRating_numOfRating($dbh,$rec->{'rid'});
            my $avgRating = cmntRating_getAvgRating($dbh,$rec->{'rid'});
            my $numOfStars =floor($avgRating);
            my $fraction= $avgRating - $numOfStars ;
            if($fraction >0.25 && $fraction<0.75){
                $numOfStars += 0.5;
            }
            elsif($fraction >0.75){
                $numOfStars += 1;
            }

            my $avgRating = sprintf("%.2f", $avgRating);
            $rec->{'rateRec'} = $avgRating;
            $rec->{'numReview'} = $noReview;
            $rec->{'numOfStars'} = $numOfStars;
           }
    }
}

#=======================================================
sub mapFacetMsg{
    my ($facet)=@_;
    foreach my $fa(@$facet){
        $fa->{'fieldTxt'} =$formatMsgMap->{$fa->{'field'}};
        $fa->{'hasIcon'}=1 if($fa->{'field'} eq 'format');
        foreach my $item(@{$fa->{'facetList'}}){
            if($fa->{'field'} =~ m/format|language/){
               $item->{'facetTxt'}=$formatMsgMap->{$item->{'facet'}};
            }
            else{
                $item->{'facetTxt'}=$item->{'facet'};
            }
        }
    }
    
}

#=======================================================
sub search_localDb{
   my  $srchLoc      =Opals::Context->preference('OWLsrchLocation');
    my $locList=[];
    foreach my $loc (split(",",$srchLoc)){
        push @$locList,$loc if($loc ne "");
    }
    my $filter;
    $filter->{'location'}=$locList;
    $rs =searchSolr($input,$filter);
    my $suggestion=undef;
    my $sfCount=0;
    
   
    if(!$rs->{'hits'}>0){   
       
        for (my $i = 0; $i <$iCount; $i++) {
            $sfOrder= 'sf' . $i;
            $kw     = 'kw' . $i;
            $boolop = 'boolop' . $i;
            my $fieldSrch = $input->{$sfOrder};
            ($fieldSrch && $fieldSrch ne '')||($fieldSrch = '1016');
            my $s='';
            if ($input->{$kw}) {
                $s= slr_getSuggestion('1016' ,$input->{$kw});    
                if($s ne ""){
                    $suggestion={field=>'1016',term=>$s};
                    $i= $iCount;
                }
            
            } 

                            
        }

    }
    return { hits=>$rs->{'hits'},
             recordList=>$rs->{'recordList'},
             suggestion=>$suggestion,
             facet=>$rs->{'facet'}
           };
}

#=======================================================
sub searchSolr{
    my ($input,$filter) =@_;
    my $lQuery=slr_buildSearchQuery($input,$filter);
    my $rs=undef;
    if($lQuery ne ''){
        $rs = slr_search({lQuery    =>$lQuery,  recFormat =>'brief',
                          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'};
    $sortAttr=undef if ($zid != 0);
    if(!$sortAttr &&  $input->{'sf0'} eq '5006'){
        $sortAttr=4;
    }
    
    $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,
    );
}

