#!/usr/bin/env python3
r"""
Generate an inventory variable file containing a list of properties
fields from the YAML phosphor-dbus-interfaces repository.
"""
import sys
import os
import yaml
import json

lib_path = sys.path[0] + "/../lib"
sys.path.insert(0, lib_path)
from gen_print import *

# This list will be longer when more development codes are available.
inventory_items = ['fru', 'core', 'fan', 'fan_wc', 'gpu']
print_var(inventory_items)
fru_inventory_file_path = 'inventory.py'
print_var(fru_inventory_file_path)

# Properties inventory list
yaml_inventory_list = []

# Clone the phosphor-dbus-interfaces repository
cmd_buf = 'git clone https://github.com/openbmc/phosphor-dbus-interfaces'
os.system(cmd_buf)

repo_subdir_path = '/phosphor-dbus-interfaces/xyz/openbmc_project/'
base_dir_path = os.getcwd() + repo_subdir_path

# yaml file paths for FRU
yaml_fru_list = ['Inventory/Item.interface.yaml',
                 'Inventory/Decorator/Asset.interface.yaml',
                 'Inventory/Decorator/Revision.interface.yaml',
                 'Inventory/Decorator/Replaceable.interface.yaml',
                 'Inventory/Decorator/Cacheable.interface.yaml',
                 'State/Decorator/OperationalStatus.interface.yaml', ]

# yaml file paths for CORE.
yaml_core_list = ['Inventory/Item.interface.yaml',
                  'State/Decorator/OperationalStatus.interface.yaml', ]

# yaml file paths for fan.
yaml_fan_list = ['Inventory/Item.interface.yaml',
                 'Inventory/Decorator/MeetsMinimumShipLevel.interface.yaml',
                 'State/Decorator/OperationalStatus.interface.yaml', ]

# yaml file paths for fan_wc (fans in water-cooled system).
yaml_fan_wc_list = ['Inventory/Item.interface.yaml',
                    'Inventory/Decorator/MeetsMinimumShipLevel.interface.yaml', ]

# yaml file paths for GPU.
yaml_gpu_list = ['Inventory/Item.interface.yaml',
                 'Inventory/Decorator/Replaceable.interface.yaml',
                 'State/Decorator/OperationalStatus.interface.yaml', ]

# Append to inventory list
yaml_inventory_list.append(yaml_fru_list)
yaml_inventory_list.append(yaml_core_list)
yaml_inventory_list.append(yaml_fan_list)
yaml_inventory_list.append(yaml_fan_wc_list)
yaml_inventory_list.append(yaml_gpu_list)

print_var(yaml_inventory_list)

# Populate Inventory data
inventory_dict = {}

for inv_index in range(len(yaml_inventory_list)):
    print_var(inv_index)
    inventory_dict[str(inventory_items[inv_index])] = []
    for rel_yaml_file_path in yaml_inventory_list[inv_index]:
        yaml_file_path = base_dir_path + rel_yaml_file_path

        # Get the yaml dictionary data
        print_timen("Loading " + yaml_file_path)
        f = open(yaml_file_path)
        yaml_data = yaml.load(f)
        f.close()
        for item in range(0, len(yaml_data['properties'])):
            tmp_data = yaml_data['properties'][item]['name']
            inventory_dict[str(inventory_items[inv_index])].append(tmp_data)

# Pretty print json formatter
data = json.dumps(inventory_dict,
                  indent=4,
                  sort_keys=True,
                  default=str,
                  separators=(',', ':'))

# Check if there is mismatch in data vs expect list
if len(inventory_dict) != len(inventory_items):
    print_error("The generated list doesn't match Inventory List.\n")
    print (data)
    print_var(inventory_items)
    sys.exit()

# Write dictionary data to inventory file
print ("\nGenerated Inventory item json format\n")
print (data)
out = open(fru_inventory_file_path, 'w')
out.write('inventory_dict = ')
out.write(data)

out.close()
print ("\nGenerated Inventory File: %s " % fru_inventory_file_path)
