#!/usr/bin/env perl

use strict;
use warnings;

use mrw::Targets;
use mrw::Inventory;
use mrw::Util;
use Getopt::Long;
use YAML::Tiny qw(LoadFile);

my $mrwFile = "";
my $outFile = "";
my $configFile = "";

GetOptions(
"m=s" => \$mrwFile,
"c=s" => \$configFile,
"o=s" => \$outFile,
)
or printUsage();

if (($mrwFile eq "") or ($configFile eq "") or ($outFile eq ""))
{
    printUsage();
}

# Load system MRW
my $targets = Targets->new;
$targets->loadXML($mrwFile);
my @inventory = Inventory::getInventory($targets);

# Target Type : Target inventory path
my %defaultPaths = (
    "ETHERNET",
     Util::getObmcName(
         \@inventory,
         Util::getBMCTarget($targets))."/ethernet"
);

# Parse config YAML
my $targetItems = LoadFile($configFile);

# Targets we're interested in, from the config YAML
my @targetNames = keys %{$targetItems};
my %targetHash;
@targetHash{@targetNames} = ();
my @targetTypes;
my @paths;

# Retrieve OBMC path of targets we're interested in
for my $item (@inventory) {
    my $targetType = "";
    my $path = "";

    if (!$targets->isBadAttribute($item->{TARGET}, "TYPE")) {
        $targetType = $targets->getAttribute($item->{TARGET}, "TYPE");
    }

    my @types = grep(/$targetType$/, @targetTypes);

    next if (length($targetType) == 0 ||
             ((not exists $targetHash{$targetType}) && (scalar @types == 0)));

    push @targetTypes, $targetType;
    push @paths, $item->{OBMC_NAME};
    delete($targetHash{$targetType});
}

for my $type (keys %targetHash)
{
    if(defined $defaultPaths{$type})
    {
        # One or more targets wasn't present in the inventory
        push @targetTypes, $type;
        push @paths, $defaultPaths{$type};
    }
}

open(my $fh, '>', $outFile) or die "Could not open file '$outFile' $!";
print $fh "FRUS=".join ',',@targetTypes;
print $fh "\n";
print $fh "PATHS=".join ',',@paths;
close $fh;

sub printUsage
{
    print "
    $0 -m [MRW file] -c [Config yaml] -o [Output filename]\n";
    exit(1);
}
