package Opals::UnionRequest;

require Exporter;
@ISA       = qw(Exporter);

@EXPORT_OK = qw(
    urq_createUnionRequest
    urq_addRec2UnionRequest
    urq_updateUnionRequestStatus
);

# Version number
$VERSION   = 0.01;      

use strict;
use Encode;
use Opals::MarcXml qw(
    mxml_exportRecord
    mxml_exportHolding
);

use LWP::UserAgent;
use HTTP::Request::Common;

    my $zRoot     = Opals::Context->config('zRoot');
    my $zPort     = Opals::Context->config('zPort');
    my $zDatabase = Opals::Context->config('zDatabase');
    my $unionId   = Opals::Context->preference('unionId');



$| = 1;
#============================================================
sub urq_createUnionRequest{
    my($dbh,$uid,$reqType,$ridBcList)=@_;

# $reqType:deletion | import
# $ridBcList: hashtable
#             key: rid
#             value: array of barcode

    $reqType = lc($reqType);
    
    if($reqType ne 'deletion' && $reqType ne  'import'){
        return;
    }

    my $sth=$dbh->prepare(<<_SQL_);
insert into opl_unionRequest
set uid=?,
    reqType=?,
    date=now()
_SQL_

    $sth->execute($uid,$reqType);
    my $reqId = $dbh->{"mysql_insertid"};
     # if $ridBcList provided, add them to request and then set it status='pending'
     # waiting to be sent to the Union server
     # otherwise leave it open and wait for rid ,bc to be added to request.
     #
    if($ridBcList){
        foreach my $rid (keys %{$ridBcList}){
            urq_addRec2UnionRequest($dbh,$reqId,$rid,$ridBcList->{$rid});
        }
        urq_updateUnionRequestStatus($dbh,$reqId,'pending');
    }
    $sth->finish;
    return $reqId;
}

#============================================================
sub  urq_addRec2UnionRequest{
    my ($dbh,$reqId,$rid,$bcList)=@_;
    # $bcList : reference to array of BC

    my $sth_detail =$dbh->prepare(<<_SQL_);
insert into opl_unionRequestDetail
set reqId=?,
    rid  =?,
    barcode=?
_SQL_


    foreach my $bc (@$bcList){
        $sth_detail->execute($reqId,$rid,$bc);
    }
    $sth_detail->finish;

}
#============================================================
sub  urq_updateUnionRequestStatus{
    my ($dbh,$reqId,$status,$unionSvrRespErr)=@_;

    $unionSvrRespErr  ="" if(!$unionSvrRespErr);
   
    my $sth =$dbh->prepare(<<_SQL_);
update  opl_unionRequest
set     status=?,
        unionSvrRespErr = ?
where   id  =?
_SQL_
 
    $sth->execute($status,$unionSvrRespErr,$reqId);
    $sth->finish;
}



#============================================================

sub http_post{
        my ($post_url,$unionId,$updateType,$reqId,$fileName,$totalRecord,$totalHolding) = @_;
        my $ua = LWP::UserAgent->new();
        $ua->agent('OPALS Union update user client');
        $ua->timeout([120]);
        my $result={status=>0,error=>""};
        my $response = $ua->request(POST "$post_url",
            Content_Type => 'multipart/form-data', 
            Content=>[unionId=>$unionId,
                      requestId=>$reqId,
                      updateType=>$updateType,
                      totalRecord=>$totalRecord,
                      totalHolding=>$totalHolding,
                      datafile=>[$fileName]]
            );
        if ($response->is_error() || !$response->is_success){
            $result->{'error'} = "connection error";
        }
        else {
            my $responseXml= $response->content ;
            if($responseXml =~ m/<status>(.*)<\/status>/i){
                $result->{'status'}= $1;
                if($result->{'status'} ne '1'){
                   if($responseXml =~ m/<error>(.*)<\/error>/i){
                        $result->{'error'}= $1;
                   }
                }
            }
         }
         return $result;
}


1;

