#!/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
);
use Opals::Template qw(
    tmpl_rangedPageList
    tmpl_read
    tmpl_write
);
use Opals::Search qw(
    srch_buildSchTitleStartWithSQLs
    srch_buildPQF
    srch_searchRecord
    srch_searchRecordSQL
    srch_searchAuthorSQLs 
    srch_searchSubjectContainWithSQLs
    srch_searchSubjectStartWithSQLs
 );
use Opals::SearchSuggestion qw(
    sug_getSuggestion
);
use Opals::Circulation qw(
    circ_infoRecord
);
use Opals::BookCover qw(
    bookCover_getUrl
);


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  $awsId =Opals::Context->preference('amazonId');
my  $awsSecretKey =Opals::Context->preference('amazonSecreteKey');
my  $syndeticsId =Opals::Context->preference('syndeticsId');
my  $showLocation =Opals::Context->preference('showLocation');
if($syndeticsId && $syndeticsId ne''){$awsId ="";}
my $isbnList="";
my ($sfOrder, $kw, $boolop);
my @sInput;
my ($query, $pqf, $sTerm);
my $iCount = 0;
my $query  = $input->{'kw0'};

($input->{'sf0'}) || ($input->{'sf0'} = 1016);
my $sfield= $input->{'sf0'};
$sfield = 1016 if(!$sfield);
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($sql,$sqlCount)=("","");
my $fieldBrowse = $input->{'fBrowse'};
my  $lang = $cgi->cookie('language');
if($lang !~ m/en|fr/i){
    $lang          = 'en';
}
my $headerStr   = 'Subject';
if($input->{'sf0'} eq '5006'){
   ($sql,$sqlCount) = srch_buildSchTitleStartWithSQLs($input);
}
elsif($fieldBrowse && $fieldBrowse ne ""){
    $template->param( srchBrowse           => 1,
                     "Browse_$fieldBrowse" =>1,);
}
else{
    $pqf =srch_buildPQF($input,$cgi,$zid);
}

  open debug, '>/tmp/debugHa';
    print debug "--- $pqf\n";
    close debug;
if ($pqf ne "" || $sql ne "" || $fieldBrowse) {
    my $pSize = 15;
    my $curPage = $input->{'pNum'};
    ($curPage && $curPage >= 1) || ($curPage = 1);
    my $offset = ($curPage - 1) * $pSize + $ENV{'Z_INDEX_BASE'};

    my ($resultSize, $result);
    if($pqf){
        ($resultSize, $result)  = srch_searchRecord($dbh, $zid, 'b', $pqf, $offset, $pSize);
    }
    elsif($fieldBrowse && $fieldBrowse ne ""){
        my $srchTerm    = $input->{'kw0'};
        if($fieldBrowse eq "author"){ 
              ($resultSize, $result) = srch_searchAuthorSQLs($dbh, ,$srchTerm , $offset, $pSize);
              $headerStr   = "Author(s) - Last name, First name";
              $headerStr = 'Auteur(s) - Nom, Prénom' if ($lang eq 'fr' );
        }
        elsif($fieldBrowse eq "subjectContain" ){ 
              ($resultSize, $result) = srch_searchSubjectContainWithSQLs($dbh, ,$srchTerm , $offset, $pSize);
        }
        elsif($fieldBrowse eq "subjectbeginWith"){ 
              ($resultSize, $result) = srch_searchSubjectStartWithSQLs($dbh, ,$srchTerm , $offset, $pSize);
        }
        if($resultSize >0 &&
            ($fieldBrowse eq "subjectContain" || $fieldBrowse eq "subjectbeginWith")){
            foreach my $rec(@$result){
                my @sbjList= split / -- /, $rec->{'strVal'};
                foreach my $sbj(@sbjList){
                  push  @{$rec->{'subjectListHa'}},{subject=>$sbj};
                }
            }

        }
        $template->param(headerStr        => $headerStr,);

   }
   else{    
        ($resultSize, $result) = srch_searchRecordSQL($dbh,'b', $sql, $sqlCount,$offset, $pSize);
    }
    my $suggestion="";
    if($resultSize==0){
        $suggestion =sug_getSuggestion($dbh,$zid,$input->{'kw0'});
    }

    my $i=0;
    foreach my $record (@$result) {
        if ($record->{'title'}) {
            $record->{'recIndex'} = $i;
            my ($numTotal, $numLoan, $numReserve, $numHold, $items)
                = circ_infoRecord($dbh, $record->{'rid'}, $record->{'itemList'});
            $record->{'numTotal'} = $numTotal;
            $record->{'numLoan'} = $numLoan;
            $record->{'numReserve'} = $numReserve;
            $record->{'numHold'} = $numHold;
            $record->{'numReserveTotal'} = $numReserve + $numHold;
            $record->{'numAvailable'} = $numTotal - $numLoan - $numHold;
            $record->{'callNum1st'} =~ s/ +/<br>/g;
            my $isbnTmpList="";  
            if($record->{'isbn'}){
                $isbnTmpList =join (",",@{$record->{'isbn'}}) . ",";
                $isbnList   .=$isbnTmpList;
            }
            $record->{'isbnList'} =$isbnTmpList;
        }
        $i++;
    }
    if($isbnList ne "" && $awsId ne "" ){
        my $bookCoverUrls= bookCover_getUrl($isbnList,$awsId,$awsSecretKey);
        foreach my $record (@$result) {
            foreach my $isbn(@{$record->{'isbn'}}){
                if($bookCoverUrls->{$isbn}){
                    $record->{'bookcover'}=$bookCoverUrls->{$isbn}->{'small'};
                }
            }
        }
    }
    if ($resultSize - $offset + 1 <= 0) {
        my $availRange = $resultSize % $pSize;
        $availRange = $pSize if ($availRange == 0); 
        $offset = $resultSize - $availRange + 1;
        $curPage = ($offset - 1) / $pSize + 1;
    }

    my $pRange = 2;
    my @rangedPageList = tmpl_rangedPageList($resultSize, $curPage, $pSize, $pRange);
    $template->param(
        zid                 => $zid,
        pqf                 => $pqf,
        bibliography        => (($#$result >= 0) ? 1:0),
        resultSize          => $resultSize,
        result              => $result,
        rec_start           => $offset +1,
        rec_end             => ($offset + 1 +$#$result) ,
        rangedPageList      => \@rangedPageList,
        sTerm               => $sTerm,
        sortable            => (1<$resultSize && $resultSize<=1000)              ? 1 : 0,
        hasSuggestion       => ($suggestion ne "")?1:0,
        suggestion          => $suggestion,
        showAmazonCover     => ($awsId && $awsId ne '')  ?1:0,
        showSyndeticsCover  => ($syndeticsId && $syndeticsId ne '')  ?1:0,
        srchBgn             => 1,
        fBrowse             =>$fieldBrowse,
       );

}

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

