import json
import networkx as nx

def load_data(file_path):
    with open(file_path, 'r') as file:
        return json.load(file)

def create_graph(data):
    G = nx.Graph()
    for part in data['allParts']:
        G.add_node(part)
    for part, connections in data['matrix'].items():
        for connected_part in connections:
            G.add_edge(part, connected_part)
    return G

def find_leaf_nodes(graph, central_node):
    leaf_nodes = []
    for node in graph.nodes:
        if node != central_node and graph.degree(node) == 1:
            leaf_nodes.append(node)
    return leaf_nodes

def find_all_paths(graph, start_node, end_node):
    try:
        return list(nx.all_simple_paths(graph, start_node, end_node))
    except nx.NetworkXNoPath:
        return []

def load_constraints(file_path):
    with open(file_path, 'r') as file:
        return json.load(file)

def is_valid_sequence(sequence, constraints):
    for constraint in constraints:
        if constraint[0] in sequence and constraint[1] in sequence:
            if sequence.index(constraint[0]) > sequence.index(constraint[1]):
                return False
    return True

def save_sequences(sequences, file_path):
    with open(file_path, 'w') as file:
        json.dump(sequences, file, indent=4)

# data = load_data('path_to_adjacency_matrix.json')
# # constraints = load_constraints('constraints.json')
# all_parts = data['allParts']
# print(all_parts)
# graph = create_graph(data)
# first_detail = data['firstDetail']
# leaf_nodes = find_leaf_nodes(graph, first_detail)

# all_sequences = []
# for leaf in leaf_nodes:
#     paths = find_all_paths(graph, leaf, first_detail)
#     for path in paths:
#         if set(path) == set(all_parts) and is_valid_sequence(path, constraints):
#             all_sequences.append(path)

# save_sequences(all_sequences, 'valid_sequences.json')

# print(f"Найдено {len(all_sequences)} допустимых последовательностей сборки.")

def process_adjacency_data(topology_matrix):
    all_parts = topology_matrix['allParts']
    graph = create_graph(topology_matrix)
    first_detail = topology_matrix['firstDetail']
    leaf_nodes = find_leaf_nodes(graph, first_detail)

    all_sequences = []
    for leaf in leaf_nodes:
        paths = find_all_paths(graph, leaf, first_detail)
        for path in paths:
            if set(path) == set(all_parts) and is_valid_sequence(path, constraints):
                all_sequences.append(path)

    return all_parts, graph, first_detail, leaf_nodes, all_sequences
