package Common::Parser::Item::XMLNode;
use strict;

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::Log;

use Data::Dumper;
use XML::Simple;

use base 'Common::Parser::Item';

sub _init {
    my $self = shift;
    my %args = @_;

    assert( $args{node},                                       "No node data" );
    assert( ref( $args{node} ) eq 'XML::XPath::Node::Element', "Not an XPath Element (" . ref( $args{node} ) . ")" );

    $self->{_node} = $args{node};
    $self->{_xpath} = new XML::XPath( xml => $self->{_node}->toString() );

    return $self;
}

sub getAllColumns { assert( 0, "Not available for XML files" ) }
sub columnCount { 1 }

sub getColumn {
    my ( $self, $xpath ) = @_;
    my $path = "$xpath";
    my @results;

    assert( defined($xpath),           "path required" );
    assert( defined( $self->{_node} ), "node not defined" );

    return unless ($xpath);

    my $nodeSet = $self->{_xpath}->findnodes($path);

    Common::Log::Debug( "NodeSet Result Size: " . $nodeSet->size() );

    while ( my $node = $nodeSet->pop() ) {
        my @children = $node->getChildNodes();
        if ( @children > 1 && $node->isa('XML::XPath::Node::Element') ) {
            push( @results, XMLin( $node->toString ) );

        } else {
            push( @results, $node->string_value );
        }
    }

    return @results > 1 ? \@results : pop(@results);
}

sub isEmpty {
    my $self = shift;

    return $self->{_node} ? 1 : undef;
}

###
1;    # Play nicely.
###
