#!/usr/bin/perl

#use utf8;
use strict;
use CGI;

use Opals::Constant;
use Opals::Context;
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
    tmpl_rangedPageList

);
use Opals::Session qw(
    SessionHdl_clearVar
);
use Opals::SolrIndex qw(
    slr_buildSearchQuery_ARL
    slr_search
    slr_getSuggestion
    slr_getARLMinMax_fieldVal
    slr_getLexileMinMax
);

use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::BackgroundJobs qw(
    bgjob_create
    bgjob_execute
    bgjob_getStatus
    bgjob_getOutput
    bgjob_process
);


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

my $cgi = CGI->new;
my $input = $cgi->Vars();
my $action = $input->{'geAction'};
my $paramJson= $input->{'param'};
my $param =$paramJson?decode_json($paramJson): undef;
my ($permission, $cookieList, $template) = tmpl_read(
    {
        dbh             => $dbh,
        cgi             => $cgi,
        tmplFile        => 'record/ge852.tmpl',
        reqPermission   => 'marc_edit',
    }
);
my $loginuid = $template->param('curUserId');
my $syspref  = tmpl_preference($dbh);
my $timeout  = $syspref->{'timeout'}; 

my $self = $ENV{'SCRIPT_NAME'};
my $jobId=undef;
my $jItemCount=0;
if($action && $param){
    ($jobId,$jItemCount) =addRequestToBgJob($dbh,$action,$param);

    if($jobId){
        my ($reqId) = $dbh->selectrow_array("select req_id from    opl_ge852request where  bgJobId=? ",undef,$jobId);
        if(!$reqId){
            $dbh->do("insert into opl_ge852request set uid=?, bgJobId=?,action=?,reqDate=now()",undef,$loginuid,$jobId,$action);
            if($jItemCount>0 && $jItemCount<=100){
                bgjob_process($dbh,$jobId);
            }
        }


    }
}

 # GET LIST OF ITEM TYPE FROM opl_itemType TABLE
        my $itemTypeList = getItemTypeList($dbh);
        $template->param(
            itemTypeList =>  to_json($itemTypeList,{pretty=>1}),
        );
  # GET LIST OF RECORD/MEDIA TYPE  FROM constant RECTYPE_DEF_TBL
       
        my $mediaTypeTbl=getRecTypeList();
        $template->param(
            mediaTypeTbl =>  to_json($mediaTypeTbl,{pretty=>1}),
        );

my $size=20;
my $offset=0;
my $pNum=$input->{'pageNo'};
if($pNum){
    $offset=($pNum -1)*$size;
}
my $totalRequest=getRequestCount($dbh);
my $requestList=getRequestList($dbh,$offset,$size);
$template->param(
             requestList=>  to_json($requestList,{pretty=>1}),
             totalRequest=> $totalRequest,
             curReqListPage=>$pNum
        );

$template->param(hlpUrl     => Opals::Constant->getHlpUrl('ge852') );
tmpl_write($dbh, $cgi, $cookieList, $template);
=item
if($jobId){
    close STDERR;
    close STDOUT;
    bgjob_execute($dbh,$jobId);

}
   
=cut  
################################################################################     
sub addRequestToBgJob{
    my ($dbh,$action,$param)=@_;
    my $sessionID = $cgi->cookie('globalSessionID');
    my $sql="select distinct rid,barcode from opl_sessionVar where ssid=? && var='ge_rid'";    
    
    # filter out item onloan in case of delete field 852 or 852$p
    if($param->{'tag'} eq '852'){        
        if($action eq 'delDatafield' || ($action eq 'delSubfield' && $param->{'code'} eq 'p')){
            $sql="select distinct s.rid,s.barcode from opl_sessionVar s 
                  left outer join opl_loan l on l.barcode=s.barcode && l.dateReturn is null
                  where ssid=? && var='ge_rid' && l.barcode is null";
        }

    }
    my $sth=$dbh->prepare($sql);
    $sth->execute($sessionID);
    my $ridBcArr=[];
    while(my($rid,$bc)=$sth->fetchrow_array){
        push @$ridBcArr,{rid=>$rid,barcode=>$bc};
    }
    my $jobId=undef;
    my $jItemCount=0;
    if(scalar(@$ridBcArr)>0){
        my $job={type=>"marcGlobalEdit",
                 action=>$action, 
                 param=>$param
                };

        ($jobId,$jItemCount)=bgjob_create($dbh,to_json($job),$ridBcArr);
        # ===== clear selected from session ======
        SessionHdl_clearVar($dbh,$sessionID,"ge_rid") if($jobId);
    }
    return ($jobId,$jItemCount);
 
}
################################################################################     
sub getItemTypeList{
    my ($dbh)= @_;
    my $sql = <<_SQL_;
SELECT     distinct id 
FROM       opl_itemType
ORDER BY    id
_SQL_

    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my @retVal;
    while (my $id = $sth->fetchrow_hashref) {
          push @retVal, $id;
    }
    $sth->finish;
           
    return \@retVal;
}
################################################################################   
sub getRecTypeList{
    my $recType =RECTYPE_DEF_TBL;
    my $msgMap  =loc_getMsgFile('search/standard.msg',{});

    my @retVal=();
    my $mTypeTbl={};
    while(my ($key, $value) = each(%$recType)){
        next if($key =~  m/^_/) ;
        my $grp=$msgMap->{$value->{'group'}->{'name'}};
        my $item={type   =>$key, 
                  icon    =>$key.".png",
                  icon_m  =>$key."_m.png",
                  name    =>$msgMap->{$key},
                  order   =>$value->{'group'}->{'order'},
                  subOrder=>$value->{'group'}->{'subOrder'},
                  };
        $mTypeTbl->{$grp}=[] if(!defined $mTypeTbl->{$grp}) ;
        push @{$mTypeTbl->{$grp}},$item;
    }
    while(my ($g, $t) = each(%$mTypeTbl)){
        push @retVal,{group=>$g,mType=>$t};
    }
    return \@retVal;
}
################################################################################     
sub getRequestCount{
    my ($dbh)=@_;
    my $total=$dbh->selectrow_array(<<_SQL_);
select count(r.req_id)
from    opl_ge852request r inner join opl_bgJob j on r.bgJobId =j.jobId 
_SQL_

    return $total;
}
sub getRequestList{
    my ($dbh,$offset,$size)= @_;
    my $sql = <<_SQL_;
select  r.uid,r.req_id,j.jobId,
        count(distinct ji.rid) as ridCount,
        count(ji.barcode) as bcCount,
        job,j.status,j.jobDate,u.username 
from    opl_ge852request r inner join opl_bgJob j on r.bgJobId =j.jobId 
        inner join opl_bgJobItem ji on j.jobId=ji.jobId 
        inner join opl_user as u using(uid)     
        group by    j.jobId      
        order by    jobId desc limit $offset,$size
_SQL_

    my $sth = $dbh->prepare($sql);
    $sth->execute();
    my @retVal;
    while (my $r = $sth->fetchrow_hashref) {
          $r->{'job'}  = decode_json($r->{'job'});
          
          push @retVal, $r;
    }
    $sth->finish;
           
    return \@retVal;
}

