#!/usr/bin/perl

#use utf8;
use strict;
use CGI;
use Opals::XML::SAX::IllMsgHandler;

use constant    WS_ERROR_UNSUPPORT_SERVICE    =>  1;
use constant    WS_ERROR_AUTHENTICATION       =>  2;
use constant    WS_ERROR_PROCESSING_SERVICE   =>  3;

use Opals::ILL qw(
    ill_res_addLoan
    ill_res_returnLoan
    ill_res_returnLoan_illMsg
    ill_res_receiveLoan
    ill_res_receiveLoan_illMsg
    
    ill_req_addLoan
    ill_req_returnLoan
    ill_req_returnLoan_illMsg
    ill_req_receiveLoan
    ill_req_receiveLoan_illMsg
);
my $WS_function={
    forRes_loan   =>\&_forRes_loan,
    forRes_return =>\&_forRes_return,
    forRes_receive =>\&_forRes_receive,

    forReq_loan   =>\&_forReq_loan,
    forReq_return =>\&_forReq_return,
    forReq_receive =>\&_forReq_receive,
};

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

my $cgi = CGI->new;
my $input = $cgi->Vars();

#-------------------------------------------------------------
my $rsXmlMsgFmt="<response><status>%d</status><errorCode>%d</errorCode></response>";
my $msg = $input->{'illMsg'};

my $illMsg =_msgParser($input->{'illMsg'});


my $sName =$illMsg->{"serviceName"};
my $rsXml="";
my $libInfo  =undef;
my $mimetype="text/xml";

if(!defined $WS_function->{$sName}){
    $rsXml =sprintf $rsXmlMsgFmt,0,WS_ERROR_UNSUPPORT_SERVICE;
}
elsif(!_authenticate($dbh)){
    $rsXml =sprintf $rsXmlMsgFmt,0,WS_ERROR_AUTHENTICATION;
}
else{
    $rsXml=$WS_function->{$sName}();

}

print $cgi->header(
    -type    => '$mimetype',
    -charset => 'utf-8',
),$rsXml;

#-------------------------------------------------------------
sub _forRes_loan{
    my $autoCreateLoanTrans=1;
    my $rs =ill_res_addLoan($dbh,$illMsg,$autoCreateLoanTrans);
    my ($status,$errCode)=(1,0);
    if($rs==0){  
        ($status,$errCode)=(0,WS_ERROR_PROCESSING_SERVICE);
    }
    return   $rsXml =sprintf $rsXmlMsgFmt,$status,$errCode;
}
#-------------------------------------------------------------
#sub _forRes_return{
#    my $rs =ill_res_returnLoan_illMsg($dbh,$illMsg);
#    my ($status,$errCode)=(1,0);
#    if($rs==0){  
#        ($status,$errCode)=(0,WS_ERROR_PROCESSING_SERVICE);
#    }
#    retqurn   $rsXml =sprintf $rsXmlMsgFmt,$status,$errCode;
#}
#-------------------------------------------------------------
sub _forRes_return{
    my $ret =ill_res_returnLoan_illMsg($dbh,$illMsg);

    foreach my $r (@$ret){
        if($r->{'procsessStatus'}==0){  
            $r->{'errCode'}= WS_ERROR_PROCESSING_SERVICE;
        } 
    }
    return   $ret;

}
#-------------------------------------------------------------
sub _forRes_receive{
    my $ret =ill_res_receiveLoan_illMsg($dbh,$illMsg);
    foreach my $r (@$ret){
        if($r->{'procsessStatus'}==0){  
            $r->{'errCode'}= WS_ERROR_PROCESSING_SERVICE;
        } 
    }
    return   $ret;

}



#-------------------------------------------------------------
sub _forReq_loan{
    my $rs =ill_req_addLoan($dbh,$illMsg);
    my ($status,$errCode)=(1,0);
    if($rs==0){  
        ($status,$errCode)=(0,WS_ERROR_PROCESSING_SERVICE);
    }
    return   $rsXml =sprintf $rsXmlMsgFmt,$status,$errCode;

}

#-------------------------------------------------------------
sub _forReq_return{
    my $rs =ill_req_returnLoan_illMsg($dbh,$illMsg);
    my ($status,$errCode)=(1,0);
    if($rs==0){  
        ($status,$errCode)=(0,WS_ERROR_PROCESSING_SERVICE);
    }
    return   $rsXml =sprintf $rsXmlMsgFmt,$status,$errCode;
    
}
#-------------------------------------------------------------
sub _forReq_receive{
    my $ret =ill_req_receiveLoan_illMsg($dbh,$illMsg);
    foreach my $r (@$ret){
        if($r->{'procsessStatus'}==0){  
            $r->{'errCode'}= WS_ERROR_PROCESSING_SERVICE;
        } 
    }
    return   $ret;

}


#-------------------------------------------------------------
sub _authenticate{
    my($dbh)=@_;
    my $auth=0;
    my $ip=$cgi->remote_addr();
    #return $auth;
    return 1;

}
#-------------------------------------------------------------

sub _msgParser {
    my ($xmlMsg)=@_;
    my $msg={};
    if($xmlMsg){
        my $parser = XML::SAX::ParserFactory->parser(
                Handler => Opals::XML::SAX::IllMsgHandler->new
                );
        $parser->parse_string($xmlMsg);
        $msg  =$parser->{'Handler'}->getMsg();

    }
    return $msg;
}

1;
