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

from gen_print import *

import sys
import os
import yaml
import json

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

# 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.safe_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)
