#!/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
);

use XML::SAX;
use base qw( XML::SAX::Base );
use Opals::MarcXmlParser; 
use Opals::SolrIndex qw(
    slr_search
    slr_buildSearchQuery
    
);
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);

use Opals::RecordInfoHTML qw(
    rinfo_getBibRecordHTML
    rinfo_getSimilarItemsHTML
    rinfo_getRecCircInfoHTML
    rinfo_getPageNavForm_search
    rinfo_getRatingInfoHTML
);
use Opals::Circulation qw(
    circ_infoRecord
);
use Opals::Date qw(
    date_f005
);

use Opals::Search qw(
    srch_buildNewItemSQLs
    srch_searchRecordSQL
    srch_recordBrief
);
use Opals::BookCover qw(
    bookCover_getUrl
);
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,);

my $marcXmlParser=undef;

$template->param('showpqf' => $showpqf,);

my ($query, $pqf, $sTerm);
my $sortFieldMap={
    title_asc       =>"titleSort,author,callNumber,pubDateSort,barcode,r.rid",
    title_desc      =>"titleSort DESC,author DESC,callNumber DESC,pubDateSort DESC,barcode DESC,rid DESC",
    author_asc      =>"author,titleSort,callNumber,pubDateSort,barcode,rid",
    author_desc     =>"author DESC,titleSort DESC,callNumber DESC,pubDateSort DESC,barcode DESC,rid DESC",
    callNumber_asc  =>"callNumber,titleSort,author,pubDateSort,barcode,rid",
    callNumber_desc =>"callNumber DESC,titleSort DESC,author DESC,pubDateSort DESC,barcode DESC,rid DESC",
    pubDateSort_asc =>"pubDateSort,titleSort,author,callNumber,barcode,rid",
    pubDateSort_desc=>"pubDateSort DESC,titleSort DESC,author DESC,callNumber DESC,barcode DESC,rid DESC",
    barcode_asc     =>"barcode,titleSort,author,callNumber,pubDateSort,rid",
    barcode_desc    =>"barcode DESC,titleSort DESC,author DESC,callNumber DESC,pubDateSort DESC,rid DESC",
    rid_asc         =>"rid,titleSort,author,callNumber,pubDateSort,barcode",
    rid_desc        =>"rid DESC,titleSort DESC,author DESC,callNumber DESC,pubDateSort DESC,barcode DESC"
};

my $pref = tmpl_preference($dbh);
my $circInfoOption={};
$circInfoOption->{'enableItemStatus'}=1 if($permission && $permission->{'circ_loan'});
$circInfoOption->{'showLocation'}=$pref->{'showLocation'};

    # ---------------------- SEARCH --------------------
    my  $offset         = $input->{'recRsPos'};
    my  $rid            = $input->{'rid'};
    my $tmpInput = $input;
    my $sortAttr    = $input->{'sort2'};
    my $sortOrder   = $input->{'sortOrder'};

    my $rs={};
    my ($isFirst,$isLast);
    my $pNum = $input->{'pNum'};
    ($pNum && $pNum > 0) || ($pNum = 1);
    my $rec=undef;
    my $hits =0 ;
    my $pSize =1;   
    my $dateFrom    = $input->{'acqstFrom'};
    my $dateTo      = $input->{'acqstTo'};
    my $dateToday = date_f005();
    $dateToday =~ s/([\d]{4})([\d]{2})([\d]{2})[\d]+\.(0|1)/$1-$2-$3/;
    if(!defined $dateFrom || !defined $dateTo ||
        $dateFrom !~ m/[\d]{4}-[\d]{2}-[\d]{2}(.*)/ ||
        $dateTo !~ m/[\d]{4}-[\d]{2}-[\d]{2}(.*)/){
        $dateFrom =$dateToday;
        $dateTo   ="$dateToday";
    }
    $dateTo =~ s/([\d]{4}-[\d]{2}-[\d]{2})(.*)/$1 23:59:59/g;

    my $incExcOpt = $input->{'incExcOpt'};
    if(!$incExcOpt || $incExcOpt ne 'inclusion'){
        $incExcOpt='exclusion';
    }

    $rec =getItemAcqstInfo($dbh, $dateFrom, $dateTo, $sortAttr,$sortOrder,$offset, $pSize,$incExcOpt  );
    $hits=getTotalAcqCount($dbh, $dateFrom, $dateTo, $incExcOpt); 
    my $firstIndex=0;
    my $lastIndex=$hits -1;

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

    $rid =$rec->{'rid'};
       my  $titleFm = $rec->{'title'};
    $titleFm=~ s/[\:]+$//g;
    $titleFm=~ s/[\/]+$//g;
    $rec->{'titleFm'} = $titleFm;
    if($rec->{'subtitle'} && $rec->{'subtitle'} ne ''){
        my $subtitleFm = $rec->{'subtitle'};
        $subtitleFm=~ s/[\/]+$//g;
        $rec->{'subtitleFm'} = $subtitleFm;
    }

    my $recInfoHtml      = rinfo_getBibRecordHTML($dbh,$rec);
    my $similarItemsHtml = rinfo_getSimilarItemsHTML($rec);
    my $recCircInfoHtml  = rinfo_getRecCircInfoHTML($dbh,$rec,$circInfoOption);
    my $ratingInfo       = rinfo_getRatingInfoHTML($dbh,$rec->{'rid'});
    my $pageNavForm      = rinfo_getPageNavForm_search($cgi);
    $template->param(recInfoHtml        => $recInfoHtml,
                     similarItemsHtml   => $similarItemsHtml,
                     recCircInfoHtml    => $recCircInfoHtml,
                     pageNavForm        => $pageNavForm,
                     ratingInfo         => $ratingInfo);

    $template->param(
        idvalid     => ($rs) ? 1:0,
        rid         => $rid,
        sortAttr    => $sortAttr,
        sortOrder   => $sortOrder,
        pNum        => $pNum,
        isFirst     => $isFirst,
        isLast      => $isLast,
        recRsPos    => $offset,
     );

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

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


################################################################################
sub getItemAcqstInfo{
    my ($dbh, $dateFrom, $dateTo, $sort,$sortOrder,$offset, $pSize,$incExcOpt ) = @_;
 
 
   $sortOrder =(!$sortOrder || $sortOrder eq '')?"_asc" : "_$sortOrder";
   $sortOrder=lc($sortOrder);
   $sort ="rid" if(!$sort || !defined $sortFieldMap->{"$sort$sortOrder"});
   my $sortCond = $sortFieldMap->{"$sort$sortOrder"};
   my $sql = " select  r.rid
                from    opl_item as i inner join opl_marcRecord as r  on i.rid = r.rid 
                where   substring(i.barcode, 1, 3) <> '___' &&
                        i.dateImport >= '$dateFrom' &&
                        i.dateImport <= '$dateTo' ";
 
 if($incExcOpt eq 'exclusion'){
       $sql .= " && (r.tempIll is NULL ||  r.tempIll = '') ";
  }
   $sql .= " order by $sortCond";
   $sql .=   "   limit   $offset, $pSize ";


 
   my $sth = $dbh->prepare($sql);
   $sth->execute();   

    my $indexConfFile  = Opals::Context->config('sIndexConfig');
    $marcXmlParser=Opals::MarcXmlParser->new($indexConfFile) if (!defined $marcXmlParser);
    my $rec=undef;
    if (my ($rid) = $sth->fetchrow_array) {
        my $fname=recordPath($rid)."/$rid.xml";
        $rec=$marcXmlParser->getRecInfoGeneral_file($fname);
   }
    $sth->finish;



     return  $rec;
       
}
#####################################################

sub getTotalAcqCount{
    my($dbh, $dateFrom, $dateTo,$incExcOpt)=@_;
    my $total=0;
    my $szSQL = "select count(distinct i.rid) from opl_item i inner join
                opl_marcRecord m using(rid)
               where substring(barcode, 1, 3) <> '___' && dateImport>='$dateFrom' && dateImport<='$dateTo' ";
    if($incExcOpt eq 'exclusion'){
         $szSQL .= " && (m.tempIll is NULL ||  m.tempIll = '') ";
    }  
               
    $query = $dbh->prepare($szSQL);
    $query->execute();
    if( my($countRid) = $query->fetchrow_array){
        $total=$countRid;
    }
    $query->finish;
    return $total;
}
#####################################################
sub recordPath {
    my ($rid) = @_;
    
    my $zRoot   = Opals::Context->config('zRoot');
    my $zPort   = Opals::Context->config('zPort');
    my $zDatabase = Opals::Context->config('zDatabase');
    my $dir     = "$zRoot/$zPort/record/$zDatabase/" . ceil($rid/1000);

    return $dir;
}


