#!/usr/bin/env python
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', 'gpu']
print_var(inventory_items)
fru_inventory_file_path = 'inventory.py'
print_var(fru_inventory_file_path)

# Properties master list
yaml_master_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 GPU.
yaml_gpu_list = ['Inventory/Item.interface.yaml',
                 'Inventory/Decorator/Replaceable.interface.yaml',
                 'State/Decorator/OperationalStatus.interface.yaml', ]
# Append to master list
yaml_master_list.append(yaml_fru_list)
yaml_master_list.append(yaml_core_list)
yaml_master_list.append(yaml_fan_list)
yaml_master_list.append(yaml_gpu_list)

print_var(yaml_master_list)

# Populate Inventory data
inventory_dict = {}

for master_index in range(len(yaml_master_list)):
    print_var(master_index)
    inventory_dict[str(inventory_items[master_index])] = []
    for rel_yaml_file_path in yaml_master_list[master_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[master_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 Master 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: ", fru_inventory_file_path
