#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::Search qw(
    srch_parseSearchTerm
    srch_searchRecord
    srch_infoLibrary
    srch_recordBrief
    srch_searchRecordSQL
    srch_buildNewItemSQLs
    srch_buildSchTitleStartWithSQLs
    srch_buildArlSQL
    srch_buildPQF
    srch_buildPQF_owl
);
use Opals::Circulation qw(
    circ_infoRecord
);
use Opals::User qw(
    user_currentUser
);
use Opals::Marc21 qw(
    mc21_infoGeneral
);
use Opals::Session qw(
    SessionHdl_get
);
use Opals::BookCover qw(
    bookCover_getUrl
);
use Opals::Rating qw(
    cmntRating_getInfoByRid
);
use POSIX qw(
    ceil
    floor
);
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/recInfo.tmpl',
        }
);

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  $rating =Opals::Context->preference('rating');

if($syndeticsId && $syndeticsId ne''){$awsId ="";}
my $rid = $input->{'rid'};
my $resultOrder = $input->{'resultOrder'};
my $direction   = $input->{'direction'};
$direction =0 if(!$direction );
my $srchPage = $input->{'srchPage'};
#$rid = undef if ($rid < 1);
# Cookie::sortAttr
my $sortAttr = $input->{'sortAttr'};
$sortAttr=undef if ($zid != 0);
$template->param(sortAttr => $sortAttr,);

# Cookie::sortOrder
my $sortOrder = $input->{'sortOrder'};
$template->param(sortOrder => $sortOrder,);
my $sqlCond="";

my $src = $input->{'src'};
my ($query, $pqf, $sTerm);


my $pref = tmpl_preference($dbh);

if (!$rid) {
    $template->param(
        error => 1,
    );
}
else {
    my ($sfOrder, $kw, $boolop);
    my @sInput;
    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;
        # cleanup...
        #$input->{$kw} = fdgadfg
        push @sInput, {
            iOrder  => "$i",
            sOrder  => "$input->{$sfOrder}",
            sKw     => "$input->{$kw}",
            sBool   => "or",
        };
    }
    $template->param(sInput => \@sInput,);
    my($sql,$sqlCount)=("","");
    if($input->{'sf0'} eq '5006'){
       ($sql,$sqlCount) = srch_buildSchTitleStartWithSQLs($input);
    }
    elsif($input->{'srchPage'} eq 'newItem'){
        my  $selNumOfDays =$input->{'range'};   
       ($sql,$sqlCount)= srch_buildNewItemSQLs($input);
       $template->param( selNumOfDays => $selNumOfDays,);

        
    }
    elsif($input->{'program'}){
         ($sql,$sqlCount)= srch_buildArlSQL($input);
         $template->param(
             program => $input->{'program'},
             arReadingLevelFrom => $input->{'arReadingLevelFrom'},
             arReadingLevelTo => $input->{'arReadingLevelTo'},
             arPointValueFrom => $input->{'arPointValueFrom'},
             arPointValueTo => $input->{'arPointValueTo'},
             arInterestLevel => $input->{'arInterestLevel'},
             rcReadingLevelFrom => $input->{'rcReadingLevelFrom'},
             rcReadingLevelTo=> $input->{'rcReadingLevelTo'},
             rcPointValueFrom => $input->{'rcPointValueFrom'},
             rcPointValueTo => $input->{'rcPointValueTo'},
             rcInterestLevel => $input->{'rcInterestLevel'},
             lexileReadingLevelFrom => $input->{'lexileReadingLevelFrom'},
             lexileReadingLevelTo => $input->{'lexileReadingLevelTo'},
             lexileInterestLevel => $input->{'lexileInterestLevel'},        
        );

    }
    else{
        $pqf =srch_buildPQF_owl($input,$cgi,$zid,$pref->{'OWLsrchLocation'});
    }     

    my $pNum = $input->{'pNum'};
    ($pNum && $pNum > 0) || ($pNum = 1);

    
    if($srchPage eq 'beginner'){
        $template->param(beginnerSrch=>1);
    }
    elsif($srchPage eq 'advance'){
        $template->param(advanceSrch=>1);
    }
    elsif($srchPage eq 'arl'){
        $template->param(ARL_search=>1);
    }
    elsif($srchPage eq 'newItem'){
        $template->param(newItem=>1);
    }
    else{
        $template->param(standardSrch=>1);
    }
       
    $template->param(
        stdSrch            => 1 ,
        sortAttr    => $input->{'sortAttr'},
        sortOrder   => $input->{'sortOrder'},
        pNum        => $pNum,
        resultOrder      => $input->{'resultOrder'},
    );
    # See Search.pm for more info.
#    my @searchField = srch_searchField();
#    my $pqf = "\@attr 1=$searchField[7]->{attVal} $rid";
    if(($src && $src eq 'bookShelf') || ($pqf eq '' && $sqlCond eq '')){
       $pqf = "\@attr 1=12 $rid";
    }
    my ($resultSize, $xml) ;
    if($sql ne ''){
        ($resultSize, $xml) = srch_searchRecordSQL($dbh,  'f',   $sql , $sqlCount , $resultOrder+$direction,1);
    }
    elsif($pqf ne ''){
        ($resultSize, $xml) = srch_searchRecord($dbh, $zid, 'f', $pqf, $resultOrder+$direction, 1, undef, $direction);
    }
    my $isbnList="";
    my $bkShelfMidCallno="";
    my $bkShelfMidRecId=0;
    if ($resultSize != 0) {
        my $amazonBookCover="";
        my $recBrief =srch_recordBrief($xml->[0]);
        
        if(($awsId ne "" || $syndeticsId ne "" )
            && $recBrief->{'isbn'} && $recBrief->{'isbn'} ne ''){

            $isbnList .=join (",",@{$recBrief->{'isbn'}}) . ",";
            if($awsId ne ""){
                my $bookCoverUrl= bookCover_getUrl($isbnList,$awsId,$awsSecretKey);
                foreach my $isbn(@{$recBrief->{'isbn'}}){
                     if($bookCoverUrl->{$isbn}->{'medium'}){
                        $amazonBookCover=$bookCoverUrl->{$isbn}->{'medium'};
                     }
                     elsif($bookCoverUrl->{$isbn}->{'small'}){
                        $amazonBookCover=$bookCoverUrl->{$isbn}->{'small'};
                     }
                }
            }
        }
        $rid=$recBrief->{'rid'};
               
        my %info = mc21_infoGeneral($xml->[0], $input->{'sysFilter'});
        my $recMedium = $info{'medium'};
        my ($numTotal, $numLoan, $numReserve, $numHold, $items,$totalCirc)
            = circ_infoRecord($dbh, $rid, $info{'itemList'});
        my $numAvailable = $numTotal - $numLoan - $numHold;
        my $callnumber;
        my $itemOrder=0;
        foreach my $i(@$items){
            $i->{'itemOrder'} = $itemOrder++;
            #$i->{'callnumber'}=~ s/ +/<br>/g;
        }
        foreach my $i(@$items){
            if($i->{'callnumber'} ne '' && $bkShelfMidCallno eq ''){
                $bkShelfMidCallno = $i->{'callnumber'};
                $bkShelfMidRecId  = $rid;
                 
                last;
            }

        }

        if (Opals::Context->config('type')) {
            my ($lib, $sCode, $lCode);
            foreach my $holding (@{$info{'itemList'}}) {
                $sCode = $holding->{'sCode'};
                $lCode = $holding->{'lCode'};
                if ($lCode) {
                    if (!$lib->{$lCode}) {
                        $lib->{$lCode} = 
                            srch_infoLibrary($dbh, {sCode => $sCode, lCode=>$lCode});
                    }

                    if ($lib->{$lCode}) {
                        $holding->{'sName'} = $lib->{$lCode}->{'sName'};
                        $holding->{'lName'} = $lib->{$lCode}->{'lName'};
                    }
                }
            }
        }
        my $union852 = Opals::Context->preference('union852');

        my ($isFirst,$isLast);
        my $firstIndex=0;
        my $lastIndex=$resultSize -1;
        if($sqlCond ne ''){
           $firstIndex =1;
           $lastIndex +=1;
        }
        $isFirst =  ((!$direction && $resultOrder == $firstIndex) || ($direction && $resultOrder+$direction == $firstIndex));
        $isLast =  ((!$direction && $resultOrder == $lastIndex) || ($direction && $resultOrder+$direction == $lastIndex));
        my $dsplUnion = ($union852 == 3) ? 5 : ($union852 == 1 || $union852 == 2) ? 4 : 3;
        if ($template->param('showLocation')) {
            $dsplUnion++;
        }

       
        $template->param(\%info);
        $template->param(
            bkShelfMidCallno    =>$bkShelfMidCallno,
            bkShelfMidRecId     =>$bkShelfMidRecId,
            idvalid      => 1,
            zid          => $zid,
            rid          => $rid,
            medium       => $recMedium,
            resultOrder  => $resultOrder+$direction,
            isFirst      => $isFirst,
            isLast       => $isLast,
            numTotal     => $numTotal,
            numLoan      => $numLoan,
            totalCirc      => $totalCirc,
            numReserve   => $numReserve,
            numHold      => $numHold,
            numAvailable => $numAvailable,
            items        => $items,
            amazonBookCover    => $amazonBookCover,
            syndeticsBookCover    => $syndeticsId,
            isbnList     => $isbnList,
            sysFilter    => $input->{'sysFilter'},
            dsplcode     => ($union852 == 1 || $union852 == 3) ? 1 : 0,
            dspllib      => ($union852 == 2 || $union852 == 3) ? 1 : 0,
            dsplUnion    => $dsplUnion,
        );

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


    }
    else {
        $template->param(
            idvalid      => 0
        );
    }
}

$template->param(
    reserveActive => ($permission->{'circ_rsrv'}) ? 1 : 0,
    #Ha 2006-12-20 
    reserveActive => ($permission->{'circ_rsrv_self'}) ? 1 : 0,
    
);

if ($permission && $permission->{'marc_edit'}) {
    $template->param(marc_edit => 1);
}
$template->param(bibliography => 1);

$template->param(
    kw0 =>  $input->{'kw0'},
);

my $msgValMap ={};
my $msgMap            =loc_getMsgFile('report/reports.msg',$msgValMap);
loc_write($template,$msgMap);


tmpl_write($dbh, $cgi, $cookie, $template);
