package Opals::SIF::AckGetMsgHandler;

# Version number
$VERSION   = 0.01;


use warnings;
use strict;
use XML::Simple;
use XML::XPath;
use Opals::SIF::SIF_MsgFactory;
use Opals::SIF::HTTPService;
use Opals::SIF::Specs ;

use XML::LibXML;
my $SIF_SUPPORT_VERSION={
    "2.4"=>1
};

sub new {
    my ($class) = @_;
    my $self={};
    $self->{'httpService'} =Opals::SIF::HTTPService->new();
    $self->{'sifMsgFactory'}=Opals::SIF::SIF_MsgFactory->new();

    bless $self, $class;
    return $self;
}

############################################################################################
#
#   REF:http://specification.sifinfo.org/Implementation/2.4/Messaging.html#Messaging
#
############################################################################################

sub processMsg{
    my ($self,$zone,$SIF_Info,$xmlMsg)=@_;
    $self->{'zone'}=$zone;
    $self->{'SIF_Info'}=$SIF_Info;
    $self->{'xmlMsg'}=$xmlMsg;
    $self->STEP_1($zone,$SIF_Info,$xmlMsg);

}
############################################################################################
sub STEP_1{
    my ($self)=@_;
    my $xmlMsg = $self->{'xmlMsg'};
    my $parser   = XML::LibXML->new();
    eval { $parser->parse_string($xmlMsg); };
    if($@){
        my $ackMsg=$self->createZisAckMsg_error(1,2);
        $self->STEP_12($ackMsg);
    }

    else{
         $self->{"ackMsg"}=XML::XPath->new(xml=>$xmlMsg);
         $self->STEP_3();
    }
}
############################################################################################
sub STEP_2{
    my ($self)=@_;
    my $ackMsg=$self->createZisAckMsg_error(1,3);
    $self->STEP_12($ackMsg);

}

############################################################################################
sub STEP_3{
    my ($self)=@_;
    
    #Is the root element of the message unprefixed with a local name of SIF_Message?
    ## to be reviewed; for now just process as there is no such kind of error

    $self->STEP_5();
}
############################################################################################
sub STEP_4{
    my ($self)=@_;

    my $ackMsg=$self->createZisAckMsg_error(1,3);
    $self->STEP_12($ackMsg);

}
############################################################################################
sub STEP_5{
    my ($self)=@_;
    my $version=$self->getVersion();
    if($SIF_SUPPORT_VERSION->{$version}){
        $self->STEP_7();
    }
    else{
        $self->STEP_6();
    }
}
############################################################################################
sub STEP_6{
    my ($self)=@_;
    my $ackMsg=$self->createZisAckMsg_error(12,3);
    $self->STEP_12($ackMsg);

}
############################################################################################
sub STEP_7{
    my ($self)=@_;

    # From specs: If your Agent does not validate messages, go to step 9. Otherwise choose a
    # validation schema based on the value of SIF_Message/@Version. Does the message validate?
    #
    # presently, no need to validate messages go to step 9 as described in protocol
    #

    $self->STEP_9();
}
############################################################################################
sub STEP_8{
    my ($self)=@_;
}
############################################################################################
sub STEP_9{
    my ($self)=@_;

    # presently we only handle 2 type of mesages SIF_Response and SIF_Event

    if($self->{"ackMsg"}->exists(XPATH_RESPONSE_MSGID) 
       || $self->{"ackMsg"}->exists(XPATH_EVENT_MSGID)){

        $self->STEP_11();
    }
    else{
        $self->STEP_10();

    }
   
}
############################################################################################
sub STEP_10{
    my ($self)=@_;
    my $ackMsg=$self->createZisAckMsg_error(12,2);
    $self->STEP_12($ackMsg);


}
############################################################################################
sub STEP_11{
    my ($self)=@_;
    if($self->{"ackMsg"}->exists(XPATH_RESPONSE_MSG)){
        #$self->processMsg_response();
    }
    elsif($self->{"ackMsg"}->exists(XPATH_EVENT_MSG)){
         #$self->processMsg_Event();
    }
   my $sifInfo=$self->{'SIF_Info'};
   my $ackMsgInfo={sifCode=>0};
   if($self->{"ackMsg"}->exists(XPATH_EVENT_MSGID)){
        $ackMsgInfo->{"originalMsgId"}=$self->{"ackMsg"}->getNodeText(XPATH_EVENT_MSGID);
   }
   if($self->{"ackMsg"}->exists(XPATH_EVENT_SOURCEID)){
        $ackMsgInfo->{"originalSourceId"}=$self->{"ackMsg"}->getNodeText(XPATH_EVENT_SOURCEID);
    }
   my $ackMsg =$self->{'sifMsgFactory'}->createMessage($sifInfo,"SIF_Ack",$ackMsgInfo);
   $self->STEP_12($ackMsg);     



}
############################################################################################
sub STEP_12{
    my ($self,$ackMsg)=@_; 
    print $ackMsg->getXml(),"\n"; 
    #my $rs=$self->{'httpService'}->post($self->{'zone'},$ackMsg->getXml());
}
############################################################################################
sub getVersion{
    my ($self)=@_;
    my $version=1.1; #default version is 1.1 if attribute Version is omitted
    my $xpath="/SIF_Message/SIF_Ack/SIF_Status/SIF_Data/SIF_Message";
    if($self->{"ackMsg"}->exists("$xpath")){
        my ($node)=$self->{"ackMsg"}->findnodes("$xpath");
        $version= $node->getAttribute("Version");

    }

    return $version;
}

############################################################################################

sub createZisAckMsg_error{
    my ($self,$sifCategory,$sifCode)=@_;
    my $sifInfo=$self->{'SIF_Info'};


    my $ackErrInfo={error=>{SIF_Cateogry=>$sifCategory,
                            SIF_Code    =>$sifCode
                            }
                   };              

    #scan for original messageID and sourceId in the event/response section.
    #

    my $xmlMsg = $self->{'xmlMsg'};
    if($xmlMsg =~ m/<SIF_Ack>.*<SIF_Header>.*<SIF_SourceId>(.*?)<\/SIF_SourceId>/g){
    #if($xmlMsg =~ m/<SIF_(Event|Response)>.*<SIF_Header>.*<SIF_SourceId>(.*?)<\/SIF_SourceId>/g){
        $ackErrInfo->{"originalSourceId"}=$1;
    }
    $xmlMsg = $self->{'xmlMsg'};
    if($xmlMsg =~ m/<SIF_Ack><SIF_Header><SIF_MsgId>(.*?)<\/SIF_MsgId>/g){
    #if($xmlMsg =~ m/<SIF_(Event|Response)>.*<SIF_Header>.*<SIF_MsgId>(.*?)<\/SIF_MsgId>/g){
        $ackErrInfo->{"originalMsgId"}=$1;
    }

    my $ackErrMsg= $self->{'sifMsgFactory'}->createMessage($sifInfo,"SIF_Ack",$ackErrInfo);
    return  $ackErrMsg;

    
}


############################################################################################
1;

