#!/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',
                   '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
