#! /usr/bin/perl
use strict;
use warnings;

use mrw::Targets;
use mrw::Inventory;
use Getopt::Long; # For parsing command line arguments
use YAML::XS 'LoadFile'; # For loading and reading of YAML file

# Globals
my $serverwizFile  = "";
my $debug           = 0;

# Command line argument parsing
GetOptions(
"i=s" => \$serverwizFile,    # string
"d"   => \$debug,
)
or printUsage();

if (($serverwizFile eq ""))
{
    printUsage();
}

my $targetObj = Targets->new;
$targetObj->loadXML($serverwizFile);

#open the mrw xml Fetch the FRU id,type,object path from the mrw.

my @inventory = Inventory::getInventory($targetObj);
for my $item (@inventory) {
    my $isFru = 0, my $fruID = 0, my $fruType = "";
    my $isChildFru = 0;

    #Fetch the fruid.
    if (!$targetObj->isBadAttribute($item->{TARGET}, "FRU_ID")) {
        $fruID = $targetObj->getAttribute($item->{TARGET}, "FRU_ID");
        $isFru = 1;
    }

    #Fech the fru type.
    if (!$targetObj->isBadAttribute($item->{TARGET}, "TYPE")) {
        $fruType = $targetObj->getAttribute($item->{TARGET}, "TYPE");
    }

    #skip those entries whose type is NA and is not fru.
    next if ( $fruType eq 'NA' or not($isFru) or $fruType eq 'BMC');

    printDebug ("FRUID => $fruID, FRUType => $fruType, ObjectPath => $item->{OBMC_NAME}");

}
#------------------------------------END OF MAIN-----------------------

# Usage
sub printUsage
{
    print "
    $0 -i [MRW filename] [OPTIONS]
Options:
    -d = debug mode
        \n";
    exit(1);
}

# Helper function to put debug statements.
sub printDebug
{
    my $str = shift;
    print "DEBUG: ", $str, "\n" if $debug;
}
