#!/usr/bin/perl

#use utf8;
use strict;
use JSON;
use CGI;
use Digest::SHA qw(
    sha1_base64
    sha1_hex
);
use POSIX qw(
    ceil
);
use Opals::Context;

use Opals::Eq_SolrSearch;
use Opals::Eq_SolrSearch1;

use Opals::Equipment qw(
    eq_record_getItemList
);

use Opals::Tb_Report qw(
  tb_rpt_getItemListByStatus
);
use Opals::Eq_Report qw(
	eq_rpt_getReturnedItemList 
);
use Opals::Session qw(
    SessionHdl_viewMovingHolding
    SessionHdl_mhPrevNextRecord
    SessionHdl_moveHolding
    SessionHdl_setTarget
    SessionHdl_add
    SessionHdl_del
    SessionHdl_get
    SessionHdl_clearVar
    SessionHdl_exist_rid
    SessionHdl_exist_bc
    SessionHdl_count
    SessionHdl_getBriefRecList
    SessionHdl_getBrRecListByHolding
    SessionHdl_getSSID
    SessionHdl_rename
    SessionHdl_getSelBibRecs
);
my $FN_MAP={
    add     =>\&add,
    del     =>\&del,
    get     =>\&get,
    clear   =>\&clear,
    addAll  =>{ 
      eq_searchRs   =>\&addAll_eq_searchRs,
      eq_ge_searchRs=>\&addAll_eq_ge_searchRs
    },
    clearAll  =>{
      searchRs    =>\&delAll_searchRs,
      globalMod   =>\&delAll_ge,
      ge          =>\&delAll_ge
    },
    count       =>\&count,
};

my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }
my $request=getRequest();
my $cgi    = CGI->new;
my $ssid   = SessionHdl_getSSID($cgi);
my $ssidCookie=CGI::Cookie->new(-name=>'globalSessionID',-value=>$ssid);

my $action=$request->{'action'};
my $selectSrc=$request->{'selectSrc'};
my $count;
my $selItems;
if(defined $FN_MAP->{$action}){
    my $fn=undef;
    if($action =~ m/addAll|clearAll/  && defined $FN_MAP->{$action}->{$selectSrc}){
        $fn =$FN_MAP->{$action}->{$selectSrc};
    }
    else{
        $fn = $FN_MAP->{$action};
    }
    if(defined $fn){
        if( $action ne 'count'){
            if($action eq 'get' || $action eq 'getSelBibRecs' 
                || ($action =~ m/addAll|clearAll/ && $selectSrc eq 'searchRs')){
                $selItems=&$fn();
            }
            else{
                &$fn();
            }
        }
        $count=count();
    }
}
print "Set-Cookie: $ssidCookie\n";
#print "Content-type: text/plain\n\n";

print "Content-type: application/json\n\n";
my $rs={status=>1,rs=>$count,selItems=>$selItems};
print   to_json($rs);
#-------------------------------------------------------------------------------
sub getSelBibRecs{
   return SessionHdl_getSelBibRecs($dbh,$ssid);
    
}
#-------------------------------------------------------------------------------
sub renameVar{
    SessionHdl_rename($dbh,$ssid,$request->{'varName_old'},$request->{'varName_new'});
}

#-------------------------------------------------------------------------------
sub add{
   foreach my $item(@{$request->{'itemList'}}){
       #if(!SessionHdl_exist_bc($dbh,$ssid, $request->{'varName'},$item->{'barcode'})){
            SessionHdl_add($dbh,$ssid, $request->{'varName'},$item->{'rid'},$item->{'barcode'},$item->{'note'});
       #}
   }
}
#-------------------------------------------------------------------------------
sub del{
   foreach my $item(@{$request->{'itemList'}}){
        SessionHdl_del($dbh,$ssid,$request->{'varName'},$item->{'rid'},$item->{'barcode'},$item->{'note'});
   }
   return 1;
}
#-------------------------------------------------------------------------------
sub get{
    return SessionHdl_get($dbh,$ssid,$request->{'varName'},$request->{'offset'},$request->{'count'});
}
#-------------------------------------------------------------------------------
sub count{
    my ($ridCount,$bcCount)= SessionHdl_count($dbh,$ssid,$request->{'varName'});
    return {ridCount=>$ridCount,bcCount=>$bcCount};
}
#-------------------------------------------------------------------------------
sub clear{
   SessionHdl_clearVar($dbh,$ssid,$request->{'varName'});
   return 1;
}
#-------------------------------------------------------------------------------
sub addAll_tbItemStatusList{ 

    my $from    =$request->{'from'};
    my $to      =$request->{'to'} ;
    my $status  =$request->{'status'};
    my $sort    =$request->{'sort'};
    my $sortDir =$request->{'sortDir'};
    my $varName= $request->{'varName'};
    my $rs = tb_rpt_getItemListByStatus ($dbh, 0, 10000,  $from,  $to, $sort ,$sortDir,$status);
    #my $rs =rpt_getItemListByStatus($dbh,$status,$from,$to,undef,undef,$sort,$sortDir,$incIllTmp);
    if($rs->{'found'}>0){
        foreach my $item(@{$rs->{'itemList'}}){
            SessionHdl_add($dbh,$ssid,$varName,$item->{'rid'},$item->{'barcode'},$item->{'ondate'});
        }
    }
}


sub addAll_eq_searchRs{
   my $eq_solr = Opals::Eq_SolrSearch->new(dbh=>$dbh);
   my ($offset,$size)=(0,10);
   my $varName = $request->{'varName'};
   my $rs=undef;
   my $lQuery = $eq_solr->eq_slr_srchQuery($request->{'searchParam'});  
   #$lQuery .= "&fl=rid,eq_name,barcode&wt=json";
   if($lQuery ne ''){
     while(1) {
        $request->{'searchParam'}->{'offset'} = $offset;
        $request->{'searchParam'}->{'pSize'} = $size;
        $lQuery = $eq_solr->eq_slr_srchQuery($request->{'searchParam'});
        my $params={
            lQuery=>$lQuery,
            displayStyle=>$request->{'searchParam'}->{'displayStyle'}|| 'linear',
        };
        $rs = $eq_solr->eq_slr_search1($params);
        if ($rs->{'hits'}>0){
          foreach my $r (@{$rs->{'recordList'}}){
            if ($request->{'searchParam'}->{'displayStyle'} eq "linear") {
                $r->{'itemList'} = eq_record_getItemList($dbh,$r->{'eq_rid'});
                foreach my $h(@{$r->{'itemList'}}){
                    SessionHdl_add($dbh,$ssid, $varName,$r->{'rid'},$r->{'barcode'}||$r->{'eq_barcode'} );
                }
            }else{
                SessionHdl_add($dbh,$ssid, $varName,$r->{'rid'},$r->{'barcode'}||$r->{'eq_barcode'} );
            }
          }
          $offset +=$size;
          last if($offset>$rs->{"hits"});
        }
        else{last;}
     }
     if($request->{'filterLoan'} ==1){
        $dbh->do("delete s from opl_sessionVar s inner join eq_loan l on l.barcode=s.barcode where l.dateReturn is null && s.var=? && s.ssid=?",undef,$varName,$ssid);
     }
   } 
   return $rs;
}

sub addAll_eq_returnedItemList{
 my ($total,$count,$nSelected,$list,$totalPrice) = eq_rpt_getReturnedItemList($dbh,$request->{'searchParam'});
 my $varName = $request->{'varName'};
 foreach my $l (@{$list}){
   foreach my $d (@{$l->{'data'}}){
     SessionHdl_add($dbh,$ssid, $varName,$d->{'idloan'},"");
   }
 }
}
sub addAll_eq_ge_searchRs{
 my $eq_solr = Opals::Eq_SolrSearch->new(dbh=>$dbh);
   my ($offset,$size)=(0,10);
   my $varName = $request->{'varName'};
   my $rs=undef;
   my $lQuery = $eq_solr->eq_slr_srchQuery($request->{'searchParam'});  
   if($lQuery ne ''){
     while(1) {
        $request->{'searchParam'}->{'offset'} = $offset;
        $request->{'searchParam'}->{'pSize'} = $size;
        $lQuery = $eq_solr->eq_slr_srchQuery($request->{'searchParam'});
        my $params={
            lQuery=>$lQuery,
            displayStyle=>$request->{'searchParam'}->{'displayStyle'}||'linear',
        };
        $rs = $eq_solr->eq_slr_search1($params);
        if ($rs->{'hits'}>0){
          foreach my $r (@{$rs->{'recordList'}}){
            SessionHdl_add($dbh,$ssid, $varName,$r->{'rid'},$r->{'eq_barcode'})
          }
          $offset +=$size;
          last if($offset>$rs->{"hits"});
        }
        else{last;}
     }
     if($request->{'filterLoan'} ==1){
        $dbh->do("delete s from opl_sessionVar s inner join eq_loan l on l.barcode=s.barcode where l.dateReturn is null && s.var=? && s.ssid=?",undef,$varName,$ssid);
        }
   } 
}
#-------------------------------------------------------------------------------
sub getRequest{
  my $in={};
  if ($ENV{'REQUEST_METHOD'} eq "POST") {
        my $json ="";
        while (<STDIN>) {
            $json .= $_;
        }
        $in = decode_json($json);
   }
   return $in;
}
#------------------------------------------------------------------------------
