#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use POSIX qw(
    ceil
    floor
);
use Opals::Context;#use MARC::File::USMARC;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
    tmpl_rangedPageList
    tmpl_getSearchFieldList
);

use XML::SAX;
use base qw( XML::SAX::Base );
use Opals::MarcXmlParser; 
use Opals::SolrIndex qw(
    slr_search
    slr_getSimilarItem
    slr_buildSearchQuery
    slr_buildSearchQuery_ARL
    slr_getSuggestion
    slr_updateIndexDir
    slr_updateIndexFile
    slr_delIndex
    slr_browseSubject_beginWith
    slr_browseSubject_keyword
    slr_browseAuthor_keyword
    
);
use Opals::Circulation qw(
    circ_getItemStatus
    circ_infoRecord
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::Date qw(
    date_now
    date_text
    date_today
    date_parse
    );
use Date::Calc qw(
Delta_Days
);
use Opals::BookCover qw(
    bookCover_getUrl
);

use Opals::Rating qw(
    cmntRating_getInfoByRid
);
use Opals::RecordInfoHTML qw(
  rinfo_getRecInfo  
);


use Opals::Constant;

    my $dbh = Opals::Context->dbh();
    my $cgi     = CGI->new;
    my $input = $cgi->Vars();
    END { $dbh->disconnect(); }

my ($permission, $cookie, $template) = tmpl_read(
        {
            dbh             => $dbh,
            cgi             => $cgi,
            tmplFile        => 'search/recDetailPage.tmpl',
        }
);
my $msgValMap={} ;
my $self = $ENV{'SCRIPT_NAME'};
my @cookieList = (@$cookie);
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);
my $portals;
 $template->param(portals  =>$portals);

my  $lang = $cgi->cookie('language');
my  $screenRes = $cgi->cookie('screenRes');
if($screenRes >1024){
    $screenRes =1280;
}
else{
    $screenRes =1024;
}
if($lang !~ m/en|fr/i){
    $lang          = 'en';
}
my $pref = tmpl_preference($dbh);
my $multilingual          = $pref->{'multilingual'};
my $link1_name            = $pref->{'link1_name'};
my $link1_url             = $pref->{'link1_url'};
my $link2_name            = $pref->{'link2_name'};
my $link2_url             = $pref->{'link2_url'};
  $template->param(
        link1_name=>$link1_name ,
        link1_url =>$link1_url ,
        link2_name=>$link2_name , 
        link2_url =>$link2_url , 
   );
    my $iCount = 0;
    #writeSortParam2tmpl($input);
    # ---------------------- SEARCH --------------------
    my  $showLocation   =Opals::Context->preference('showLocation');
    my  $rating         =Opals::Context->preference('rating');
    my  $offset         = $input->{'recRsPos'};
    my  $rid            = $input->{'rid'};
    setPageNavForm($cgi);
    my $tmpInput = $input;
    if(defined $rid && $rid>0){
         $tmpInput={kw0 =>$rid, sf0 =>'12'};
         $offset=0;
    }

    my $sortAttr    = $input->{'sortAttr'};
    my $sortOrder   = $input->{'sortOrder'};
    my $lQuery      = slr_buildSearchQuery($tmpInput);
    my $rs          = slr_search({lQuery=>$lQuery,recFormat=>'detail',
                            sortAttr=>$sortAttr,sortDir=>$sortOrder, 
                            offset=>$offset,size=>1,
                            incCircStatus=>1});

    my ($numTotal, $numLoan, $numReserve, $numHold, $items,$totalCirc)
            = circ_infoRecord($dbh,$rs->{'recordList'}[0]->{'rid'},@{$rs->{'recordList'}}[0]->{'itemList'});
    my $numAvailable = $numTotal - $numLoan - $numHold;

    
    my $pf = $input->{'pfCall'};
    my $pNum = $input->{'pNum'};
    ($pNum && $pNum > 0) || ($pNum = 1);
    my ($isFirst,$isLast);
    my $firstIndex=0;
    my $lastIndex=$rs->{'hits'} -1;

    $isFirst =  ($offset == $firstIndex);
    $isLast  =  ($offset == $lastIndex) ;

    $rid =$rs->{'recordList'}[0]->{'rid'};
    my $recInfo = rinfo_getRecInfo($dbh,$cgi,$rid);
    $template->param(recInfo=>$recInfo);
    getSimilarItems(@{$rs->{'recordList'}}[0]);
=item
    getItemStatus($dbh,@{$rs->{'recordList'}}[0]);
    getBookCover();

    foreach my $f(keys %{@{$rs->{'recordList'}}[0]}){
        $template->param($f =>@{$rs->{'recordList'}}[0]->{$f});
    }
=cut    
    $template->param(
        zid         => $zid,
        hits        => $rs->{'hits'},
        pf          => ($pf && $pf>0) ? 1:0,
        idvalid     => ($rs) ? 1:0,
        rid         => $rid,
        sortAttr    => $sortAttr,
        sortOrder   => $sortOrder,
        pNum        => $pNum,
        isFirst     => $isFirst,
        isLast      => $isLast,
        recRsPos    => $offset,
        numTotal    => $numTotal,
        numLoan     => $numLoan,
        totalCirc   => $totalCirc,
        numReserve   => $numReserve,
        numHold      => $numHold,
        numAvailable => $numAvailable,
    );
     getRatingInfo($dbh)if($rating && $rating >=1 ) ;

my $stdMsgMap  =loc_getMsgFile('search/standard.msg',$msgValMap);
loc_write($template,$stdMsgMap);
my $infoMsgMap            =loc_getMsgFile('record/info.msg');
loc_write($template,$infoMsgMap);
$infoMsgMap            =loc_getMsgFile('record/bib_info.msg');
loc_write($template,$infoMsgMap);
my $msgMap            =loc_getMsgFile('report/reports.msg',$msgValMap);
loc_write($template,$msgMap);

 
tmpl_write($dbh, $cgi, \@cookieList, $template);

  
#=======================================================
sub getSimilarItems{
    my($rec)=@_;
    my $rid= $rec->{'rid'};  
    my $litForm=$rec->{'literayForm'};
    my $fiction=($litForm =~ m/^fiction$|^shortStories$/)?1:0;
    my $similarRecList = slr_getSimilarItem($rid,$fiction);
    $template->param(similarRecList=>$similarRecList);

}
#=======================================================
sub getRatingInfo{
    my($dbh)=@_;
    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,
    );

}
#=======================================================
sub setPageNavForm{
    my ($cgi,)=@_;
    my $input=$cgi->Vars();
    my @recType     = $cgi->param('recType');
    my $navFormInput=[];
    foreach my $iName(keys %$input){
        push @$navFormInput,{name=>$iName, value=>$input->{$iName}};
    }
    my @recType     = $cgi->param('recType');
    foreach my $rType(@recType){
        push @$navFormInput,{name=>'recType', value=>$rType};
    }
    my @fieldArr =qw(languageFilter formatFilter authorFilter subjectFilter deweyFilter eraFilter genreFilter);
    foreach my $f(@fieldArr){
        if(!defined $input->{$f}){
            push @$navFormInput,{name=>$f, value=>''};
        }
    }
    if(!defined $input->{'pNum'}){
        push @$navFormInput,{name=>'pNum', value=>1 };
    }
    my $refUrl=$input->{'back2RsPageURL'};
    if(!defined $input->{'back2RsPageURL'}){
        $refUrl=$ENV{'HTTP_REFERER'};
        push @$navFormInput,{name=>'back2RsPageURL', value=>$refUrl };
    }
    $template->param(navFormInput => $navFormInput);
}
#=======================================================
# 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,
    );



}
#=======================================================
#Tue, Sep 07, 2010 @ 15:22:57 EDT
sub getItemStatus{
    my($dbh,$rs)=@_;
    foreach my $item(@{$rs->{'itemList'}}){
        my $s=circ_getItemStatus($dbh,$item->{'barcode'});
        my $od = 0;
        $item->{'status'} =$s->{'status'};
        if($item->{'status'}==IT_STAT_MISSING){ 
            $item->{'missing'}=1;
        }
        elsif($item->{'status'}==IT_STAT_DAMAGED){
            $item->{'damaged'}=1;
        }
        elsif($item->{'status'}==IT_STAT_LOST){
            $item->{'lost'}=1;
        }
        elsif($item->{'status'}==IT_STAT_ONLOAN){
            my $today = date_today();
            my $dd = date_parse($s->{'l_duedate'});
            $item->{'overdue'} = ($dd  && $dd <$today) ? 1 : 0;
            $item->{'duedate'}=date_text($s->{'l_duedate'});
        }
    }
}

#=======================================================
sub getBookCover{
    my($rec)=@_;
    my  $awsId =Opals::Context->preference('amazonId');
    my  $awsSecretKey =Opals::Context->preference('amazonSecreteKey');
    my  $syndeticsId =Opals::Context->preference('syndeticsId');
    if($syndeticsId ne''){
        getBookCover_syndetics($rec);
    }
    elsif($awsId ne '' && $awsSecretKey ne ''){
        getBookCover_amazon($rec,$awsId,$awsSecretKey);
    }

}
#=======================================================
sub getBookCover_amazon{
    my($rec,$awsId,$awsSecretKey)=@_;
    my $isbnList="";
    my $isbnFixTbl={};
    foreach my $i(@{$rec->{'isbn'}}){
        $isbnFixTbl->{$i->{'item'}}=_fixISBN($i->{'item'});
        $isbnList .= "," . $isbnFixTbl->{$i->{'item'}};
    }
    if($isbnList ne ''){
        my $bookCoverUrls = bookCover_getUrl($isbnList, $awsId, $awsSecretKey);
        $rec->{'bookcoverURL'}="/theme/opals/image/nocover.gif";
        foreach my $i(@{$rec->{'isbn'}}){
            my $isbnfixed=$isbnFixTbl->{$i->{'item'}};
            if($bookCoverUrls->{$isbnfixed}){
                if($bookCoverUrls->{$isbnfixed}->{'medium'}){
                    $rec->{'bookcoverURL'}=$bookCoverUrls->{$isbnfixed}->{'medium'};
                }
                elsif($bookCoverUrls->{$isbnfixed}->{'small'}){
                    $rec->{'bookcoverURL'}=$bookCoverUrls->{$isbnfixed}->{'small'};
                }
                last;
            }
        }
    }
}
#=======================================================
sub getBookCover_syndetics{
    my($rec)=@_;
    my $isbnList="";
    foreach my $i(@{$rec->{'isbn'}}){
        $isbnList .= "," . $i->{'item'};
    }
    if($isbnList ne ''){
        $rec->{'bookCoverURL'}=$template->{'url_bookcover'} . "?size=sc&isbn=$isbnList" ;
    }
}
#=======================================================
sub _fixISBN{
    my($isbn)=@_;
    $isbn=~ m/([\D^x^X]*)([\dxX][\dxX -]{8,}[\dxX])([\D^x^X]*)/;
    $isbn= $2;
    $isbn=~ s/[- ]//g;
    return $isbn; 
}



