#
# (c) Jan Gehring <jan.gehring@gmail.com>
# 
# vim: set ts=3 sw=3 tw=0:
# vim: set expandtab:

package Rex::Inventory::SMBios::Section;

use strict;
use warnings;


require Exporter;
use base qw(Exporter);
use vars qw($SECTION @EXPORT);

@EXPORT  = qw(section);
$SECTION = {};

sub new {
   my $that = shift;
   my $proto = ref($that) || $that;
   my $self = { @_ };

   bless($self, $proto);

   return $self;
}

sub section {
   my ($class, $section) = @_;
   $SECTION->{$class} = $section;
}

sub has {
   my ($class, $item, $is_array) = @_;
   
   unless(ref($item) eq "ARRAY") {
      my $_tmp = $item;
      $item = [$_tmp];
   }

   no strict 'refs';

   for my $_itm (@{$item}) {
      my ($itm, $from);

      if(ref($_itm) eq "HASH") {
         $itm = $_itm->{key};
         $from = $_itm->{from};
      }
      else {
         $itm = $_itm;
         $from = $_itm;
      }
      $itm =~ s/[^a-zA-Z0-9_]+/_/g;
      *{"${class}::get_\L$itm"} = sub {
         my $self = shift;
         return $self->get($from, $is_array);
      };

      push(@{"${class}::items"}, "\L$itm");
   }

   use strict;
}

sub dmi {

   my ($self) = @_;
   return $self->{"dmi"};


}

sub get {

   my ($self, $key, $is_array) = @_;
   return $self->_search_for($key, $is_array);

}

sub get_all {

   my ($self) = @_;

   use Data::Dumper;
   my $r = ref($self);

   no strict 'refs';
   my @items = @{"${r}::items"};
   use strict;

   my $ret = {};
   for my $itm (@items) {
      my $f = "get_$itm";
      $ret->{$itm} = $self->$f();
   }

   return $ret;

}

sub dump {

   my ($self) = @_;

   require Data::Dumper;
   print Data::Dumper::Dumper($self->dmi->get_tree($SECTION->{ref($self)}));

}

sub _search_for {
   my ($self, $key, $is_array) = @_;

   unless($self->dmi->get_tree($SECTION->{ref($self)})) {
      #die $SECTION->{ref($self)} . " not supported";
      return;
   }

   my $idx = 0;
   for my $entry (@{ $self->dmi->get_tree($SECTION->{ref($self)}) }) {
      my ($_key) = keys %{$entry};
      if($is_array) {
         if ($idx != $self->get_index()) {
            ++$idx;
            next;
         }
      }

      if(exists $entry->{$key}) {
         return $entry->{$key};
      }
      else {
         return "";
      }
      ++$idx;
   }

   return "";
}

sub get_index {

   my ($self) = @_;
   return $self->{"index"} || 0;

}



1;

