#!/usr/bin/perl

use strict;
use CGI;

use Opals::Context;
use Opals::Locale qw(
    loc_getMsgFile
    loc_write
);
use Opals::Template qw(
    tmpl_read
    tmpl_write
    tmpl_preference
);
use Opals::NoticeEmailSvc qw(
    emailSvc_holdReady
    emailSvc_cancelReserve
    emailSvc_reject
);
use Opals::User qw(
    user_getInformationById
);
use Opals::Circulation qw(
    circ_getRecInfo
    circ_getHoldListByRid
);

use Time::localtime;
use JSON;

my $dbh = Opals::Context->dbh();
END { $dbh->disconnect(); }
my $input=getInput();
my $cgi = CGI->new;


my $pref    = tmpl_preference($dbh);
my $libName = $pref->{'libname'};  
my $tm = localtime;
my $today = sprintf("%04d-%02d-%02d", $tm->year+1900, ($tm->mon)+1, $tm->mday);
my $id          = $input->{'id'};
my $email       = $input->{'email'};
my $msg         = $input->{'msg'} || ""; 
my $type        = $input->{'type'};    
my $emailSubject= $input->{'emailSubject'}||"";    

my ($errCode, $ck, $resp) = Opals::User::user_currentUser($dbh, $cgi);
my $fnMap={rejectEmail        =>\&emailSvc_reject,
           cancelReserveEmail =>\&emailSvc_cancelReserve,
           holdReadyEmail     =>\&emailSvc_holdReady
          };

my $rs={status=>0,email=>$email}; 

if(defined $fnMap->{$type}){
    my $req=getRequestInfo($dbh,$id);
    my $reserveInfo=undef;
    my ($userInfo, $guardian) = user_getInformationById($dbh, $req->{'uid'});
    my $itemInfo    =circ_getRecInfo($dbh, $req->{'rid'});

    if($req->{'idReserve'}>0){
        $reserveInfo=getReserveInfo($dbh,$req->{'idReserve'});
    }
  
    my $fn=$fnMap->{$type};
    $rs->{'status'}=&$fn($dbh,{msg      =>$msg,
                              email     =>$email,
                              emailSubject=>$emailSubject,
                              reserveInfo=>$reserveInfo,
                              userInfo  =>$userInfo,
                              itemInfo  =>$itemInfo,
                              libName   =>$pref->{'libname'},
                              libType   =>$pref->{'libraryType'}
                             });

    if(defined $rs->{'status'} && $rs->{'status'}){
       my $log= to_json({messages=>$msg||'',dateProcess=>$today});
       $dbh->do("insert into opl_reqReserveHistory set reqId=?,uid=?,action=?,log=? "
                 ,undef,$id,$resp->{'uid'},$type,$log); 
    }


}



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

#-------------------------------------------------------------
sub getRequestInfo{
    my ($dbh,$id)=@_;
    my $req=$dbh->selectrow_hashref("select * from opl_requestReserve where id= $id");
    return $req;
    
}

#-------------------------------------------------------------
sub getReserveInfo{
    my ($dbh,$idReserve)=@_;
    my  $reserveInfo=$dbh->selectrow_hashref("select * from opl_reserve where idReserve=?", undef, $idReserve);
    if($reserveInfo){
        my $sth=$dbh->prepare("select * from opl_hold  where  idReserve=? && dateLoan is null 
                               && dateCancel is null && dateExpiry > now() ");
        $reserveInfo->{'holdList'}=[];
        $sth->execute($idReserve);
        while(my $h=$sth->fetchrow_hashref){
             push @{$reserveInfo->{'holdList'}},$h;
        }
    }
    return $reserveInfo;
    
}

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

#------------------------------------------------------------------------

