import json
import networkx as nx

def add_nodes_from_dict(graph, parent_node, current_dict):
    for key, value in current_dict.items():
        if isinstance(value, dict):
            # Create a new node for the nested dictionary
            new_node = f"{parent_node}.{key}"
            graph.add_node(new_node, label=key)
            # Add an edge from the parent node to the new node
            graph.add_edge(parent_node, new_node, edge_type=key)
            # Recurse into the nested dictionary
            add_nodes_from_dict(graph, new_node, value)
        elif isinstance(value, list):
            
            # if list doesn't contain any nested dictionaries, make it a value in the node
            if any(isinstance(item, dict) for item in value)==False:
                graph.nodes[parent_node][key] = value
            
            else:
            
                # Process each dictionary in the list
                for index, item in enumerate(value):
                    if isinstance(item, dict):
                        if len(value)>1:
                            item_node = f"{parent_node}.{key}[{index}]"
                        else:
                            item_node = f"{parent_node}.{key}"
                        graph.add_node(item_node, label=key)
                        graph.add_edge(parent_node, item_node, edge_type=key)
                        add_nodes_from_dict(graph, item_node, item)
                
        else:

            # For non-dict and non-list values, add them as attributes to the parent node
            graph.nodes[parent_node][key] = value

def add_json_to_networkx(json_data, bundle_name, graph):
    if not isinstance(graph, nx.DiGraph):
        raise ValueError("The provided graph must be a networkx.DiGraph")
    root_node = bundle_name+'_bundle'
    graph.add_node(root_node, label='root')
    add_nodes_from_dict(graph, root_node, json_data)
