package Opals::XML::SAX::SolrRsHandler;

# Version number
$VERSION   = 0.01;

use warnings;
use strict;
use XML::SAX;
use base qw( XML::SAX::Base );
#################################################################
sub new {
    my ($class) = @_;
    my $type = shift;
    my $self={numFound=>'0',result=>{list=>undef},license=>undef,facet=>[],section=>''};
    $self->{text}="";
    $self->{'tmp'}=[];
    $self->{'curFieldName'}=[];

    bless $self, $class;
    return $self;
}
sub getHits{
    my ($self)=@_;
    return $self->{'numFound'};
}
sub getResult{
     my ($self)=@_;
     my $rs=[];
     my $arr=$self->{'result'}->{'list'};
     foreach my $e(@$arr){
         my $doc={};
         foreach my $f(@{$e->{'list'}}){
             if(defined $f->{'list'} && ref $f->{'list'} eq "ARRAY"){
                 my $listName=$f->{'name'}."List";
                 $doc->{$listName}=[] if(!defined $doc->{$listName});
                 my $fName=$f->{'name'};
                 
                 foreach  my $item( $f->{'list'}){
                    
                    push @{$doc->{$listName}},{$fName=>$item};
                }
             }
             else{
                $doc->{$f->{'name'}}=$f->{'val'};
             }
         }
         push @$rs,$doc;

     }
     return $rs;
}
#################################################################
sub getFacetFields{
    my ($self)=@_;
     my $facet=[];
     my $arr=$self->{'facet'};
     foreach my $f(@$arr){
         if($f->{'name'} eq 'facet_fields'){
            $facet=$f->{'list'};
            last;
         }
     }
     return $facet;
}
#################################################################
sub getLicense{
    my ($self)=@_;
    return $self->{"license"};
}
#################################################################
sub start_element {
    my ($self, $element) = @_;
    my $name = $element->{'Name'};
    my $attr = fixAttrName($element->{'Attributes'});
    my $fieldName=$attr->{'name'}->{'Value'};
   # $fieldName = (defined $fieldName && $fieldName ne '')? $fieldName : "aaa";
    push @{ $self->{'curFieldName'}} , $fieldName;

    if($name eq 'result'){
         $self->{'numFound'} =$attr->{'numFound'}->{'Value'};
         $self->{'result'}->{'list'}=[];
         $self->{'section'}='result';
         $self->{'tmp'}=[];

    }
    elsif($name eq 'lst' && $attr->{'name'}->{'Value'} eq 'facet_counts'){
        $self->{'section'}='facet';
        $self->{'tmp'}=[];
    }
   
   if( $self->{'section'} eq 'result'){
        if($name eq 'doc' || $name eq 'arr' ){
            my $e ={list=>[]};
            $e->{'name'}=$fieldName if(defined $fieldName && $fieldName ne '');
            push @{$self->{'tmp'}},$e;
            if(defined $fieldName  && $fieldName eq 'license'){
                $self->{'subSection'}=$fieldName;
            }
        }
        elsif($name eq 'str' && defined $self->{'subSection'}  && $self->{'subSection'} eq 'license'){
            my $licInfo ={licId        => $attr->{'licId'}->{'Value'},
                          type         => $attr->{'type'}->{'Value'},
                          totalLicense => $attr->{'totalLicense'}->{'Value'}
                         };
            my $e = getLastElement($self->{'tmp'});
            push @{$e->{'list'}},$licInfo;        
        }
    }
    elsif($name eq 'lst' &&  $self->{'section'} eq 'facet'){
       # $self->{'facet'}->{'list'}=[];

        my $e ={list=>[]};
        $e->{'name'}=$fieldName if(defined $fieldName && $fieldName ne '');
        push @{$self->{'tmp'}},$e;
    }
    

    $self->{text}="";
} 
#################################################################
sub end_element{
    my ($self, $element) = @_;
    my $name = $element->{'Name'};
    my $fieldName =pop @{ $self->{'curFieldName'}};

   if($name eq 'result'){
         $self->{'section'}='';
   }
   elsif($name eq 'lst' && $fieldName eq 'facet_counts'){
        $self->{'section'}='';
   }
   elsif( $self->{'section'} eq 'result'){
        if($name eq 'doc' ){
            my $d=  pop @{$self->{'tmp'}};
            my $rs= $self->{'result'};
            push @{$rs->{'list'}},$d;
        }
        elsif($name eq 'arr' ){
            my $e = pop @{$self->{'tmp'}};
            my $d= getLastElement($self->{'tmp'});
            push @{$d->{'list'}},$e;
            if($fieldName eq 'license'){
                 $self->{'subSection'}="" ;
                 foreach my $s(@{$e->{'list'}}){
                     printf "licId:%s\n", $s->{'licId'};
                 }
            }
        }
        elsif($name eq 'str' || $name eq 'int'){
            my $e = getLastElement($self->{'tmp'});
            if(defined $fieldName && $fieldName ne ''){
                push @{$e->{'list'}},{name=>$fieldName,val=>$self->{text}}; 
            }
            elsif(!defined $self->{'subSection'} || $self->{'subSection'} ne 'license'){
                push @{$e->{'list'}},$self->{text};
            }
        }
    }
    elsif( $self->{'section'} eq 'facet'){
        if($name eq 'lst'){
            my $e = pop @{$self->{'tmp'}};
            my $d= getLastElement($self->{'tmp'});
            if(defined $d){
                push @{$d->{'list'}},$e;
            }
            else {
                push @{$self->{'facet'}},$e;
            }
        }
        elsif($name eq 'int' ){
            my $e = getLastElement($self->{'tmp'});
            if(defined $fieldName && $fieldName ne ''){
                push @{$e->{'list'}},{name=>$fieldName,val=>$self->{text}}; 
            }
        }
    }
   
    $self->{text}="";
  
}

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

sub getLastElement{
    my ($arr)=@_;
    my $i=scalar(@$arr) -1;
    my $e=$i>=0?@$arr[$i]:undef;
    return $e;
}

#################################################################
sub start_element_bk {
    my ($self, $element) = @_;
    my $name = $element->{'Name'};
    my $attr = fixAttrName($element->{'Attributes'});
    if($name eq 'result'){
         $self->{'numFound'} =$attr->{'numFound'}->{'Value'};
    }
    elsif($name eq 'doc'){
        $self->{'rsIndex'}++;
        @{$self->{'result'}}[$self->{'rsIndex'}]={};
    }
    elsif($name eq 'arr'){
        my $i=$self->{'rsIndex'};
        $self->{'curFieldName'} =$attr->{'name'}->{'Value'};
        $self->{'section'}='arr';
        @{$self->{'result'}}[$i]->{$self->{'curFieldName'}}=[];
    }
    elsif($name eq 'str' && defined $attr->{'name'}->{'Value'} ){
        $self->{'curFieldName'} =$attr->{'name'}->{'Value'};
    }
    elsif($name eq 'lst' && defined $attr->{'name'}->{'Value'}){
        $self->{'curFieldName'} =$attr->{'name'}->{'Value'};     
    }


    $self->{text}="";
} 
#################################################################
sub end_element_bk {
    my ($self, $element) = @_;
    my $name = $element->{'Name'};
    if($name eq 'str'){
        my $i=$self->{'rsIndex'};
        if($self->{'section'} eq'arr'){
            push @{@{$self->{'result'}}[$i]->{$self->{'curFieldName'}}}, $self->{text};
        }
        else{
            @{$self->{'result'}}[$i]->{$self->{'curFieldName'}}=$self->{text};
        }
    }
    elsif($name eq 'arr'){
        $self->{'section'}='';
    }   
    $self->{text}="";
  
}
#################################################################
sub characters {
    my $self = shift;
    my $text = shift;
    $self->{text} .= $text->{Data};
}
#------------------------------------------------------------------------------
sub fixAttrName{
    my ( $attr ) = @_;
    my $ret={};
    foreach my $a(keys %$attr){
        my $k =$a;
        $k =~ s/{.*}//g;
        $k =~ s/^.*?://g; 
        $ret->{$k}=$attr->{$a};
    }
    return $ret;
}

1;
