#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use JSON;
use Opals::Constant;
use Opals::Context; 
use Opals::Session qw(
    SessionHdl_getSSID
);
use Opals::User qw(
    user_currentUser

);
use Opals::UnionRequest qw(
    urq_createUnionRequest
);
use Opals::User qw(
    user_getInformationById
);

my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }
my $exportRequest=getExportRequest();
my $cgi     = CGI->new;
my $ssid =SessionHdl_getSSID($cgi);
my $input= $cgi->Vars();
my ($errCode, $myCookie, $curUser) = user_currentUser($dbh, $cgi);
$exportRequest->{'uid'}=$curUser->{'uid'};

my $expFnMap={
    'hitlist'                       =>\&exportFromHitList,
    'importDateRange'               =>\&exportFromImportDateRange,
    'modDateRange'                  =>\&exportFromModDateRange,
    'modDateRange_rec_hitList'      =>\&exportFromModDateRange_hitlist, #to be implemented for records modified report.
    'modDateRange_holding_hitList'  =>\&exportFromModDateRange_hitlist,
    'ridRange'                      =>\&exportFromRidRange,
    'all'                           =>\&exportAll,
    'toUnion'                       =>\&exportToUnion,
    'getExportList'                 =>\&getExportList

};

if(defined $expFnMap->{$exportRequest->{'type'}}){
    my $fn=$expFnMap->{$exportRequest->{'type'}};
    &$fn($dbh,$exportRequest);
}
## FOR TESTING: 
## $dbh->do("update opl_marcExport set status='ready'");

print "Content-type: text/plain\n\n";
print  to_json($exportRequest);


#=================================================================================
sub exportFromHitList{
    my($dbh,$req)=@_;
    my $ssid =SessionHdl_getSSID($cgi);
    my $eParam={type=>'hitlist',
                eEncoding=> $req->{'encoding'}};
    # hitlist may come from record modified report selection.
    # so, in such case, it needs the modified date condition              
    if($req->{'dateFrom'} && $req->{'dateFrom'} ne ""  && 
       $req->{'dateTo'} && $req->{'dateTo'} ne ""){
        $eParam->{'eCriteria'}={from=>$req->{'dateFrom'},to=>$req->{'dateTo'}};
        $eParam->{'eCriteria'}->{'exportHoldingOpt'}=1;
    }
    my $ssVar="hitList_export";
    $ssVar=  $req->{'ssVar'} if(defined $req->{'ssVar'} && $req->{'ssVar'} ne "");
    my $sth = $dbh->prepare(<<_STH_);
insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        expParams       =?, 
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},to_json($eParam));
    my $eid= $dbh->{'mysql_insertid'}; 
    $dbh->do("insert into opl_ridBcdHitlistExport select $eid,i.rid,s.barcode from opl_sessionVar s 
              inner join opl_item i using(barcode) where ssid=? && var=?",undef,$ssid,$ssVar);
    $dbh->do("delete from opl_sessionVar where ssid=? && var=?",undef,$ssid,$ssVar);

}

#=================================================================================
sub exportFromImportDateRange{
    my($dbh,$req)=@_;
    my $eParam={type     =>'importDateRange',
                eEncoding=>$req->{'encoding'}};
    my $eCriteria={from=>$req->{'dateFrom'},to=>$req->{'dateTo'}};

    $eCriteria->{'exportHoldingOpt'}=$req->{'exportHoldingOpt'} || 0;
    my $filter=undef;
    if(defined $req->{'exclRecFormat'} &&  ref($req->{'exclRecFormat'}) eq 'ARRAY'){
        $filter->{'exclRecFormat'}=$req->{'exclRecFormat'};
    }
    if(defined $req->{'incItemType'} &&  ref($req->{'incItemType'}) eq 'ARRAY'){
        $filter->{'incItemType'}=$req->{'incItemType'};
    }
    $eParam->{'eCriteria'}= $eCriteria ;
    $eParam->{'filter'}   = $filter    if(defined $filter);


    my $sth = $dbh->prepare(<<_STH_);
insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        expParams       =?, 
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},to_json($eParam));

}
#=================================================================================
sub exportFromModDateRange{
    my($dbh,$req)=@_;
    #my $eType=($req->{"type"} eq  "modDateRange_rec")?"modDate_r":"modDate_h";
    
    my $eParam={type     =>'modDateRange',
                eEncoding=>$req->{'encoding'}};
    
    my $eCriteria={from=>$req->{'dateFrom'},to=>$req->{'dateTo'}};
    $eCriteria->{'exportHoldingOpt'}=$req->{'exportHoldingOpt'} || 0;
    
    my $filter=undef;
    if(defined $req->{'exclRecFormat'} &&  ref($req->{'exclRecFormat'}) eq 'ARRAY'){
        $filter->{'exclRecFormat'}=$req->{'exclRecFormat'};
    }
    if(defined $req->{'incItemType'} &&  ref($req->{'incItemType'}) eq 'ARRAY'){
        $filter->{'incItemType'}=$req->{'incItemType'};
    }
    
    $eParam->{'eCriteria'}= $eCriteria ;
    $eParam->{'filter'}   = $filter    if(defined $filter);

    my $sth = $dbh->prepare(<<_STH_);
    insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        expParams       =?, 
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},to_json($eParam));

}
#=================================================================================
sub exportFromRidRange{
    my($dbh,$req)=@_;

    my $eParam={type     =>'ridRange',
                eEncoding=>$req->{'encoding'},
                eCriteria=>{from=>$req->{'ridFrom'}, to=>$req->{'ridTo'}}
              };
    my $filter=undef;
    if(defined $req->{'exclRecFormat'} &&  ref($req->{'exclRecFormat'}) eq 'ARRAY'){
        $filter->{'exclRecFormat'}=$req->{'exclRecFormat'};
    }
    if(defined $req->{'incItemType'} &&  ref($req->{'incItemType'}) eq 'ARRAY'){
        $filter->{'incItemType'}=$req->{'incItemType'};
    }    
    $eParam->{'filter'}   = $filter    if(defined $filter);

    my $sth = $dbh->prepare(<<_STH_);
insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        expParams       =?, 
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},to_json($eParam));

}

#=================================================================================
sub exportFromModDateRange_hitlist{
    my($dbh,$req)=@_;
 
}

#=================================================================================
sub exportToUnion{
    my($dbh,$req)=@_;
    my $ssid =SessionHdl_getSSID($cgi);
    my $ssVar="hitList_export";
    my  $sth_get_ridBc = $dbh->prepare(<<_STH_);
    select i.rid,s.barcode from opl_sessionVar s 
           inner join opl_item i using(barcode) where ssid=? && var=? order by rid
_STH_
    $sth_get_ridBc->execute($ssid,$ssVar);
    my $ridBcList;
    while(my ($rid,$bc)= $sth_get_ridBc->fetchrow_array){
        push @{$ridBcList->{$rid}},$bc;  
    }

    urq_createUnionRequest($dbh,$req->{'uid'},"import",$ridBcList);
}

#=================================================================================
sub exportAll{
    my($dbh,$req)=@_;
     my $eParam={type     =>'all',
                eEncoding=>$req->{'encoding'}
                };
    my $filter=undef;
    if(defined $req->{'exclRecFormat'} &&  ref($req->{'exclRecFormat'}) eq 'ARRAY'){
        $filter->{'exclRecFormat'}=$req->{'exclRecFormat'};
    }
    if(defined $req->{'incItemType'} &&  ref($req->{'incItemType'}) eq 'ARRAY'){
        $filter->{'incItemType'}=$req->{'incItemType'};
    }    
    $eParam->{'filter'}   = $filter    if(defined $filter);
   my $sth = $dbh->prepare(<<_STH_);
insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        expParams       =?, 
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},to_json($eParam));
    
}

#=================================================================================
sub getExportRequest{
    my $request={};
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        my $json ="";
        while (<STDIN>) {
            $json .= $_;
        }
       $request = decode_json($json);
    }
    return $request;
}
#=================================================================================
sub getExportList{
    my ($dbh,$r)=@_;
      #status ('waiting','processing','ready') 
      my $status= $r->{'status'};
      my $offset = ($r->{'pNum'} -1) * $r->{'pSize'} || 0;
    my $sql = <<_STH_;
select  *, to_days(dateExpiry) - to_days(now()) as deltaExpiry
from    opl_marcExport
_STH_
     $sql  .= " where status = '$status'" if($status && $status ne '');
     $sql  .= " order by dateRequest desc";
     $sql .= " limit $offset , $r->{'pSize'}";
    my $sth = $dbh->prepare($sql);

    my @request;

    my $exportType={hitlist         => "Hitlist",
                    importDateRange =>"Import date range", 
                    ridRange        => "Range record id",
                    modDateRange    =>"Modified date range",
                    all             =>"entire collection"

                    };
    my ($user, $guardian,$eType);
    $sth->execute() || return;
    while (my $req = $sth->fetchrow_hashref) {
        if(!$req->{'expParams'}){
           next; 
        }
        my $expParams= decode_json($req->{'expParams'});
        while( my( $key, $value ) = each %{$expParams} ){
            if($key eq "type"){
                $req->{"typeTxt"} = $exportType->{$value};
            }
            $req->{$key} = $value;
        }
        ($user, $guardian) = user_getInformationById($dbh, $req->{'uid'});
        $req->{'responsible'}='';
        if($user->{'lastname'} && $user->{'lastname'} ne ''){
            $req->{'responsible'} = $user->{'lastname'} ;
        }
        if($user->{'firstname'} && $user->{'firstname'} ne ''){
            $req->{'responsible'} .= ", " if($req->{'responsible'} ne '');
            $req->{'responsible'} .= $user->{'firstname'};
        }
        $req->{'status_'.$req->{'status'}} = 1;
        
             push @request, $req;

    } 
    $sth->finish;
    #my ($count)= $dbh->selectrow_array("select count(*) from opl_marcExport");
    my ($count)= $dbh->selectrow_array("select count(*) from opl_marcExport where expParams is not null");
    $r->{'requestList'} = \@request;
    $r->{'count'} = $count;


}
#=================================================================================
