#!/usr/bin/env perl

use strict;
use warnings;

use mrw::Targets;
use mrw::Inventory;
use mrw::Util;
use Getopt::Long; # For parsing command line arguments
use YAML::Tiny qw(LoadFile);

# Globals
my $serverwizFile  = "";
my $debug          = 0;
my $outputFile     = "";
my $metaDataFile   = "";
my $skipBrokenMrw  = 0;

# Command line argument parsing
GetOptions(
"i=s" => \$serverwizFile,    # string
"m=s" => \$metaDataFile,     # string
"o=s" => \$outputFile,       # string
"skip-broken-mrw" => \$skipBrokenMrw,
"d"   => \$debug,
)
or printUsage();

if (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq ""))
{
    printUsage();
}

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

# Open the MRW xml and the Metadata file for the sensor.
# Get the IPMI sensor information based on the Entity ID and Sensor Type.
# Fetch the Sensor ID, Event/Reading Type and Object Path from MRW.
# Get the Sensor Type and Offset from the metadata file.
# Merge and generate an output YAML with inventory object path as the key.

open(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!";
my $metaDataConfig = LoadFile($metaDataFile);

my @interestedTypes = keys %{$metaDataConfig};
my %types;

@types{@interestedTypes} = ();

my @inventory = Inventory::getInventory($targetObj);
#Process all the targets in the XML
foreach my $target (sort keys %{$targetObj->getAllTargets()})
{
    my $sensorID = '';
    my $sensorType = '';
    my $eventReadingType = '';
    my $path = '';
    my $obmcPath = '';
    my $entityID = '';
    my $base = "/xyz/openbmc_project/inventory";

    if ($targetObj->getTargetType($target) eq "unit-ipmi-sensor") {

        $sensorID = getNumeric($targetObj, $target, "IPMI_SENSOR_ID");
        $sensorType = getNumeric($targetObj, $target, "IPMI_SENSOR_TYPE");
        $eventReadingType = getNumeric(
            $targetObj, $target, "IPMI_SENSOR_READING_TYPE");
        $path = $targetObj->getAttribute($target, "INSTANCE_PATH");
        $entityID = getNumeric($targetObj, $target, "IPMI_ENTITY_ID");

        # Look only for the interested Entity ID & Sensor Type
        next if (not exists $types{$entityID});
        next if ($sensorType ne $metaDataConfig->{$entityID}->{SensorType});

        #if there is ipmi sensor without sensorid or sensorReadingType or
        #Instance path then die

        if ($sensorID eq '' or $eventReadingType eq '' or $path eq '') {
            next if $skipBrokenMrw;
            close $fh;
            die("sensor without info for target=$target");
        }

        # Removing the string "instance:" from path
        $path =~ s/^instance:/\//;
        $obmcPath = Util::getObmcName(\@inventory, $path);

        # If unable to get the obmc path then die
        if (not defined $obmcPath) {
            close $fh;
            die("Unable to get the obmc path for path=$path");
        }

        $base .= $obmcPath;

        print $fh $base.":"."\n";
        print $fh "  sensorID: ".$sensorID."\n";
        print $fh "  sensorType: ".$sensorType."\n";
        print $fh "  eventReadingType: ".$eventReadingType."\n";
        print $fh "  offset: ".$metaDataConfig->{$entityID}->{Offset}."\n";

        printDebug("$sensorID : $sensorType : $eventReadingType : $entityID : $metaDataConfig->{$entityID}->{Offset}")
    }
}
close $fh;

sub getNumeric
{
    my $obj = shift;
    my $target = shift;
    my $attr = shift;
    my $val = $obj->getAttribute($target, $attr);
    $val = oct($val) if $val =~ /^0/;
    return $val;
}

# Usage
sub printUsage
{
    print "
    $0 -i [MRW filename] -m [SensorMetaData filename] -o [Output filename] [OPTIONS]
Options:
    -d = debug mode
    --skip-broken-mrw = Skip broken MRW targets
        \n";
    exit(1);
}

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