package Opals::WebServiceEbookClient;

require Exporter;
@ISA       = qw(Exporter);

@EXPORT_OK = qw(

    wsc_ebookAuth
    wsc_uploadEbook
    wsc_addEbook
    wsc_updateMetadata
    wsc_getEbook
    wsc_getEbookPreview
    wsc_getFile
    wsc_deleteEbook
    wsc_searchEbook
    wsc_searchEbook_import
    wsc_updateEbookLicense
    wsc_deleteEbookLicense
    wsc_getLicense
    wsc_getLicenseList
    wsc_getBidByLidDigMsg
);

# Version number
$VERSION   = 0.01;      
use utf8;
use strict;
use Encode;



use Opals::XML::SAX::SolrRsHandler;
use Opals::XML::SAX::UploadRsHandler;
use Opals::XML::SAX::LicenseListHandler;
use Opals::XML::SAX::EbookDataHandler;

use LWP::UserAgent;
use LWP::Protocol::http; # to suppress the warning "possible typo" in the next statement
push(@LWP::Protocol::http::EXTRA_SOCK_OPTS, MaxLineLength => 0);
use HTTP::Request::Common;

my $ebs_libCode     = Opals::Context->preference('ebs_libCode');
my $ebs_accessKey   = Opals::Context->preference('ebs_accessKey');
my $ebs_host        = Opals::Context->preference('ebs_host');
   $ebs_host =~ s/^http:\/\///g;
   $ebs_host =~ s/\/+$//g;

#$ebs_host="ebook-opals.dione.scoolaid.net";
my $url="http://$ebs_host/bin/ws/eService";

$| = 1;




################################################################################
sub http_post {
    my ($postURL, $postContent) = @_;

    my $ua = LWP::UserAgent->new();
    $ua->agent('OPALS Web Service Client');
    $ua->timeout(120);
    my $result = {
        status  => 0,
        error   => '',
        content => '',
    };

    my $response = $ua->request(
        POST "$postURL",
        Content_Type => 'multipart/form-data', 
        Content => $postContent
    );

    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;
                }
            }
        }

        $result->{'content'} = $responseXml;
    }
    return $result;
}


################################################################################
#  Wed, Jun 12, 2013 @ 10:08:08 EDT
#
sub wsc_ebookAuth{
    my($authInfo)=@_;
    $authInfo->{'serviceName'}="authenticate";
    my $response = http_post($url, $authInfo);
    my $rs = $response->{'content'} || return undef;
    my $sessionID="";
    if($rs =~ m/<status>(.*?)<\/status>/){
        if($1==1){
            if($rs =~ m/<sessionID>(.*?)<\/sessionID>/){
                $sessionID=$1;
            }
        }
    }
    return $sessionID;

}
################################################################################
sub wsc_getBidByLidDigMsg{
    my($params)=@_;
    my $ret=0;
    $params->{'serviceName'}="getBidByLidDigMsg";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
    if($rs =~ m/<bid>(\d+)<\/bid>/g){
        $ret=$1;
    }
    return $ret;

    
}

################################################################################
# Wed, Jun 12, 2013 @ 10:08:20 EDT
# 
sub wsc_uploadEbook{
    my($params)=@_;
    $params->{'serviceName'}="uploadEpub";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
       $rs = fixUtf8($rs);
    my $parser = XML::SAX::ParserFactory->parser(
        Handler => Opals::XML::SAX::UploadRsHandler->new
    );

    $parser->parse_string($rs);
    return $parser->{'Handler'};



}
################################################################################
sub wsc_addEbook{
    my($params)=@_;
    $params->{'serviceName'}="addEbook";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
       $rs = fixUtf8($rs);
    my $parser = XML::SAX::ParserFactory->parser(
        Handler => Opals::XML::SAX::UploadRsHandler->new
    );
    $parser->parse_string($rs);
    return $parser->{'Handler'};



}

################################################################################
sub wsc_updateEbookLicense{
    my($params)=@_;
    my $ret={};
    $params->{'serviceName'}="updateLicense";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
    if($rs =~ m/<errorCode>(.*?)<\/errorCode>/){
        $ret->{'errorCode'}=$1;
        if($1 eq '0'){
            if($rs =~ m/<licenseID>(.*?)<\/licenseID>/){
                $ret->{'licenseID'}=$1;
            }
        }
    }
    return $ret;
}

################################################################################
sub wsc_deleteEbookLicense{
    my($params)=@_;
    my $ret={};
    $params->{'serviceName'}="deleteLicense";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
    if($rs =~ m/<errorCode>(.*?)<\/errorCode>/){
        $ret->{'errorCode'}=$1;
        if($1 eq '0'){
            if($rs =~ m/<licenseID>(.*?)<\/licenseID>/){
                $ret->{'licenseID'}=$1;
            }
        }
    }
    return $ret;

}

################################################################################
sub wsc_getLicense{
   my($params)=@_;
    my $ret={};
    $params->{'serviceName'}="getLicense";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
    if($rs =~ m/<errorCode>(.*?)<\/errorCode>/){
        $ret->{'errorCode'}=$1;
        if($1==0){
            if($rs =~ m/<licenseType>(.*?)<\/licenseType>/){
                $ret->{'licenseType'}=$1;
            }
            if($rs =~ m/<totalLicense>(.*?)<\/totalLicense>/){
                $ret->{'totalLicense'}=$1;
            }
        }
    }
    return $ret;

}
################################################################################
sub wsc_getLicenseList{
   my($params)=@_;
    $params->{'serviceName'}="getLicenseList";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
   
    my $parser = XML::SAX::ParserFactory->parser(
        Handler => Opals::XML::SAX::LicenseListHandler->new
    );
    $parser->parse_string($rs);
    return $parser->{'Handler'}->{'licenseList'};

}
#################################################################################
sub wsc_deleteEbook{
    my($params)=@_;
    my $ret={};
    $params->{'serviceName'}="deleteEbook";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return undef;
    if($rs =~ m/<errorCode>(.*?)<\/errorCode>/){
        $ret->{'errorCode'}=$1;
        if($1==0){
            if($rs =~ m/<lid>(.*?)<\/lid>/){
                $ret->{'lid'}=$1;
            }
            if($rs =~ m/<bid>(.*?)<\/bid>/){
                $ret->{'bid'}=$1;
            }
        }
    }
    return $ret;

  }

#################################################################################
sub wsc_getEbookPreview{
    my($params)=@_;
    my $ret=undef;
    $params->{'serviceName'}="getEbookPreview";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rsXml = $response->{'content'} || return undef;
       $rsXml = fixUtf8($rsXml);
    if($rsXml =~ m/<errorCode>(.*?)<\/errorCode>/){
         my $parser = XML::SAX::ParserFactory->parser(
                Handler => Opals::XML::SAX::EbookDataHandler->new
               );
        $parser->parse_string($rsXml);
        $ret->{'metadata'}=$parser->{'Handler'}->{'metadata'};
        $ret->{'TOC'}=$parser->{'Handler'}->{'TOC'};
        my @spineArr=@{$parser->{'Handler'}->{'spine'}};
        my $spine=[];
       
        foreach my $s(@spineArr){
            push @$spine,{spineItem=>$s};
        }
        $ret->{'spine'}=$spine;
    }
    return $ret;

}
#################################################################################
sub fixUtf8{
    my($xml)=@_;
    umask 002;
    my $tmpFile=`/bin/mktemp`;
    $tmpFile =~ s/\n$//gi;
    system("chown apache.apache $tmpFile");
    open FILE ,">:utf8", "$tmpFile"; print  FILE $xml;close FILE;
    open IN, "<$tmpFile";
    my $retXml="";
    while(<IN>){
        $retXml .=$_;
    }
    close IN;
    return $retXml;
}
#################################################################################
sub wsc_getEbook{
    my($params)=@_;
    my $ret=undef;
    $params->{'serviceName'}="getEbook";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rsXml = $response->{'content'} || return undef;
       $rsXml = fixUtf8($rsXml);
    if($rsXml =~ m/<errorCode>(.*?)<\/errorCode>/){
         my $parser = XML::SAX::ParserFactory->parser(
                Handler => Opals::XML::SAX::EbookDataHandler->new
               );
        $parser->parse_string($rsXml);
        $ret->{'metadata'}=$parser->{'Handler'}->{'metadata'};
        $ret->{'TOC'}=$parser->{'Handler'}->{'TOC'};
        my @spineArr=@{$parser->{'Handler'}->{'spine'}};
        my $spine=[];
        foreach my $s(@spineArr){
            push @$spine,{spineItem=>$s};
        }
        $ret->{'spine'}=$spine;
    }
    return $ret;
}
#################################################################################
sub wsc_getFile{
    my($params)=@_;
    $params->{'serviceName'}="getFile";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rsXml = $response->{'content'} || return (undef,undef);
    my $mineType=$response->{'content-type'}  ;
    return ($rsXml,$mineType);
}
################################################################################
sub wsc_updateMetadata{
    my($params)=@_;
    $params->{'serviceName'}="saveMetadata";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rs = $response->{'content'} || return ;
    my $ret=$params->{'bid'};
    if($rs =~ m/<errorCode>(.*?)<\/errorCode>/ && $1 ne '0'){
          $ret=0;  
    }
    return $ret;
    

}

#################################################################################
sub wsc_searchEbook{
    my($params)=@_;
    $params->{'serviceName'}="searchEbook";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
   # my $rs = _parseSearchRs($response->{'content'}) || return undef;
    my $rsXml = $response->{'content'};
       $rsXml = fixUtf8($rsXml);
    my $rs = _parseSearchRs($rsXml) || return undef;
}
#################################################################################
sub wsc_searchEbook_import{
    my($params)=@_;
    $params->{'serviceName'}="searchEbook4import";
    $params->{'libCode'}=$ebs_libCode;
    $params->{'accessKey'}=$ebs_accessKey;
    my $response = http_post($url, $params);
    my $rsXml = fixUtf8($response->{'content'});

    my $rs = _parseSearchRs($rsXml) || return undef;
}

#////////////////////////////////////////////////////////////////////////////
sub _parseSearchRs{
    my($rsXml)=@_;
    my $parser = XML::SAX::ParserFactory->parser(
        Handler => Opals::XML::SAX::SolrRsHandler->new
    );
     $parser->parse_string($rsXml);
     my $hits=$parser->{'Handler'}->getHits();
     my $result=$parser->{'Handler'}->getResult();
     my $facet=$parser->{'Handler'}->getFacetFields();
     my $license=$parser->{'Handler'}->getLicense();
     foreach  my $r(@$result){
        $r->{'licenseType'} =$license->{$r->{'bid'}}->{'type'};
        $r->{'totalLicense'}=$license->{$r->{'bid'}}->{'total'};
     }
    return  { hits=>$hits,recordList=>$result,facet=>$facet};

}
################################################################################

1;
