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

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_rec'      =>\&exportFromModDateRange,
    'modDateRange_holding'  =>\&exportFromModDateRange,
    'modDateRange_rec_hitList'           =>\&exportFromModDateRange_hitlist, #to be implemented for records modified report.
    'modDateRange_holding_hitList'       =>\&exportFromModDateRange_hitlist,
    'ridRange'      =>\&exportFromRidRange,
    'all'           =>\&exportAll,
    'toUnion'       =>\&exportToUnion
};

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 $ssVar="hitList_export";
    my $sth = $dbh->prepare(<<_STH_);
insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        eType           = 'hitlist',
        eEncoding       = ?,
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},$req->{'encoding'});
    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);

}
#=================================================================================
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 exportFromImportDateRange{
    my($dbh,$req)=@_;
    my $exclRecFormat="";
    if(defined $req->{'exclRecFormat'} &&  ref($req->{'exclRecFormat'}) eq 'ARRAY'){
        $exclRecFormat= join(",",@{$req->{'exclRecFormat'}});
    }
    my $sth = $dbh->prepare(<<_STH_);
insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        eEncoding       = ?,
        eType           = 'date',
        eFrom           =?,
        eTo             =?,
        exclRecFormat   =?,
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},$req->{'encoding'},$req->{'dateFrom'},$req->{'dateTo'},$exclRecFormat);

}
#=================================================================================
sub exportFromModDateRange{
    my($dbh,$req)=@_;
    my $eType=($req->{"type"} eq  "modDateRange_rec")?"modDate_r":"modDate_h";
    my $exclRecFormat="";
    if(defined $req->{'exclRecFormat'} &&  ref($req->{'exclRecFormat'}) eq 'ARRAY'){
        $exclRecFormat= join(",",@{$req->{'exclRecFormat'}});
    }
    my $sth = $dbh->prepare(<<_STH_);
    insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        eEncoding       = ?,
        eType           = ?,
        eFrom           =?,
        eTo             =?,
        exclRecFormat   =?,
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},$req->{'encoding'},$eType,$req->{'dateFrom'},$req->{'dateTo'},$exclRecFormat);

}

#=================================================================================
sub exportFromRidRange{
    my($dbh,$req)=@_;
    my($dbh,$req)=@_;
    my $exclRecFormat="";
    if(defined $req->{'exclRecFormat'} &&  ref($req->{'exclRecFormat'}) eq 'ARRAY'){
        $exclRecFormat= join(",",@{$req->{'exclRecFormat'}});
    }
    my $sth = $dbh->prepare(<<_STH_);
insert into opl_marcExport
set     uid             = ?,
        dateRequest     = now(),
        eEncoding       = ?,
        eType           = 'rid',
        eFrom           =?,
        eTo             =?,
        exclRecFormat   =?,
        dateExpiry      = now() + interval 30 day
_STH_

    $sth->execute($req->{'uid'},$req->{'encoding'},$req->{'ridFrom'},$req->{'ridTo'},$exclRecFormat);

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

    $sth->execute($req->{'uid'},$req->{'encoding'},$exclRecFormat);

    
}
#=================================================================================
sub getExportRequest{
    my $request={};
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        my $json ="";
        while (<STDIN>) {
            $json .= $_;
        }
       $request = decode_json($json);
    }
    return $request;
}
