#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use POSIX qw(
    ceil
    floor
);
use Opals::Context;#use MARC::File::USMARC;
#use MARC::File::XML;

use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_rangedPageList
    tmpl_searchFieldAdvance
);
use Opals::Search qw(
    srch_parseSearchTerm
    srch_searchRecord
    srch_searchRecordSQL 
    srch_exclusiveResultSize
    srch_zTab
    srch_buildSchTitleStartWithSQLs
    srch_buildPQF
    srch_zDatabase
);
use Opals::SearchSuggestion qw(
    sug_getSuggestion
);

use Opals::Circulation qw(
    circ_infoRecord
);
use Opals::Marc21 qw(
    mc21_infoGeneral
);
use Opals::MarcXml qw(
    mxml_delete
);
use Opals::BookCover qw(
    bookCover_getUrl
);
use Opals::Rating qw(
    cmntRating_getAvgRating
    cmntRating_numOfRating
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::WebServiceClient qw(
    wsc_getCircData
);

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

my $cgi = CGI->new;
my $input = $cgi->Vars();
#open kkk, ">/tmp/kkk";
#print kkk $input->{'kw0'};
#close kkk;
my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'search/standard_old.tmpl',
        }
);

################################################################################
# Delete Record
if ($permission && $permission->{'marc_edit'} && $ENV{'REQUEST_METHOD'} =~ m/^post$/i && $input->{'op'} eq 'delRec') {
    $template->param(
        remainList  =>  mxml_delete($dbh, $input->{'rid'}),
    );
}
#/Delete Record
################################################################################

my $self = $ENV{'SCRIPT_NAME'};
my @cookieList = (@$cookie);

# Cookie::showpqf
my $showpqf = $input->{'showpqf'};
($showpqf) || ($showpqf = $cgi->cookie('showpqf')) || ($showpqf = 0);
push @cookieList, $cgi->cookie(-name => 'showpqf', -value => $showpqf,);
$template->param('showpqf' => $showpqf,);

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

my ($query, $pqf, $sTerm);

if ($self eq $template->param('url_itemstatus')) {
    $template->param(msgItemStatus => 1);
}
# advance search, item status is a link to standard search
my ($sfOrder, $kw, $boolop);
my @sInput;


my  $awsId =Opals::Context->preference('amazonId');
my  $awsSecretKey =Opals::Context->preference('amazonSecreteKey');
my  $syndeticsId =Opals::Context->preference('syndeticsId');
my  $showLocation =Opals::Context->preference('showLocation');
my  $rating =Opals::Context->preference('rating');

my $msgValMap={} ;

if($syndeticsId && $syndeticsId ne''){$awsId ="";}

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   => $input->{$boolop},
    };
}
$template->param(sInput => \@sInput,);

writeSortParam2tmpl($input);

my($sql,$sqlCount)=("","");
if($input->{'sf0'} eq '5006'){
   ($sql,$sqlCount) = srch_buildSchTitleStartWithSQLs($input);
}
else{
    $pqf =srch_buildPQF($input,$cgi,$zid);
}

if ($pqf ne "" || $sql ne "") {
    my $pSize = ($zid) ? 10: 20;
    my $curPage = $input->{'pNum'};
    ($curPage && $curPage >= 1) || ($curPage = 1);
    my $offset = ($curPage - 1) * $pSize ;
    my ($resultSize, $result) ;
    if($pqf){
         #Ha Mon, Oct 27, 2008 @ 10:29:56 EDT????  $offset +=  $ENV{'Z_INDEX_BASE'}
        ($resultSize, $result) = srch_searchRecord($dbh, $zid, 'b', $pqf, $offset, $pSize);
    }
    else{    
        ($resultSize, $result) = srch_searchRecordSQL($dbh,'b', $sql, $sqlCount,$offset, $pSize);
    }

    my $i=0;
    my $suggestion="";
    if($resultSize==0){
        $suggestion =sug_getSuggestion($dbh,$zid,$input->{'kw0'});
    }

    my $isbns;
    foreach my $record (@$result) {
        if ($record->{'isbn'}) {
            $record->{'isbnList'} = join(',',@{$record->{'isbn'}});
            foreach my $isbn (@{$record->{'isbn'}}) {
                $isbns->{$isbn} = 1;
            }
        }
    }
    my $isbnList = join(',', keys %{$isbns});

    
    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 ($zid == 0) {
        foreach my $record (@$result) {
            if ($record->{'title'}) {
                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;  

               #---START:  Fri, Jul 03, 2009 @ 14:35:50 EDT
               if($rating && $rating ==2 ){
                   my $noReview  = cmntRating_numOfRating($dbh,$record->{'rid'});
                   my $avgRating = cmntRating_getAvgRating($dbh,$record->{'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);
                   $record->{'rateRec'} = $avgRating;
                   $record->{'numReview'} = $noReview;
                   $record->{'numOfStars'} = $numOfStars;
               }
               #---END:  Fri, Jul 03, 2009 @ 14:35:50 EDT

            }
        }
    }
    else {
        my $ridList = '';
        my @generalInfo;
        foreach my $record (@$result) {
            $ridList .= $record->{'rid'} . ',';
            
            my %gi = mc21_infoGeneral($record->{'xml'});
            $gi{'rid'} = $record->{'rid'};

            push @generalInfo, \%gi;
        }

        $ridList =~ s/[^,\d]//g;
        $ridList =~ s/(^,+|,+$)//g;
        $ridList =~ s/,+/,/g;

        if ($ridList) {
            my $zdb = srch_zDatabase($dbh, $zid);
            my $uid = $template->param('curUserId');
            $template->param(
                circData    => $zdb->{'circData'},
                studentILL  => ($zdb->{'studentILL'} && $uid),
#                studentILL  => ($zdb->{'studentILL'} && 
#                                $permission && 
#                                $permission->{'circ_ill_req'}),
            );

            # 1. send request to union
            my $circData;
            if ($zdb->{'circData'}) {
                $circData = wsc_getCircData($zdb->{'host'}, $ridList);
            }

            # 2. append results from union
            foreach my $rec (@{$result}) {
                my $rid = $rec->{'rid'};
                foreach my $sf852a (@{$rec->{'stat852a'}}) {
                    my $sf852a_value = $sf852a->{'code852a'};
                    foreach my $sf852b (@{$sf852a->{'list852b'}}) {
                        my $sf852b_value = $sf852b->{'code852b'};
                        my $location = $sf852b->{'location'};

                        foreach my $k (keys %{$circData->{$rid}->{$location}}) {
                            $sf852b->{$k} = 
                                $circData->{$rid}->{$location}->{$k};

                            if ($circData->{$rid}->{$location}->{'unionId'} eq 
                                    $zdb->{'locationId'}) {
                                $sf852b->{'isLocal'} = 1;
                            }
                        }
                    }
                }
            }
        }

        $template->param(
            generalInfo => \@generalInfo,
        );
    }

    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 = 10;
    my @rangedPageList = tmpl_rangedPageList($resultSize, $curPage, $pSize, $pRange);

    $msgValMap ={searchResultMsgtxt=>{rec_start=>($offset +1),
                                     rec_end=>($offset + $#$result +1),
                                     resultSize=>$resultSize}
                };

      
    $template->param(
        bibliography        => (($zid == 0 && $#$result >= 0) ? 1:0),
        resultSize          => $resultSize,
        result              => $result,
        pNum                => $curPage,
        rec_start           => $offset +1,
        rec_end             => ($offset + $#$result +1),
        rangedPageList      => \@rangedPageList,
        sTerm               => $sTerm,
        stdSrch             => 1 ,
        sortable            => ($zid ==0 && 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,
        showLocation        =>($showLocation eq '1')?1:0,
     );

    #if($resultSize >6){
    my $sf = $input->{'sf0'};
        
    if($sf == 1016 || $sf == 21){    
          $template->param(targetSubjSrch =>1,);
    }
    #}

}
else {
    if ($self eq $template->param('url_srchAdv')) {
        my @inputSearch = tmpl_searchFieldAdvance($dbh);
        $template->param(
            srchAdv => 1,
            inputSearch => \@inputSearch,
        );
    }
    elsif ($self eq $template->param('url_srchZimport')) {
    }
}

my @siteTab = srch_zTab($dbh, $zid);
$template->param(
    zid => $zid,
    kw0 => (($self eq $template->param('url_srchAdv')) ? '' : $input->{'kw0'}),
    pqf => ($pqf || $sql),
    siteTab => \@siteTab,
);
#Mon, Nov 30, 2009 @ 09:04:13 EST
#
my $stdMsgMap  =loc_getMsgFile('search/standard.msg',$msgValMap);
loc_write($template,$stdMsgMap);

if ($zid) {
    my $infoMsgMap = loc_getMsgFile('record/bib_info.msg');
    loc_write($template, $infoMsgMap);
}

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,
    );



}
