import FreeCAD as App
from .geometric_feasibility_predicate.main import main as asm_analysis
from get_sequences import process_adjacency_data
from valid_sequences import filter_valid_sequences
from solve_optimizer import restore_full_sequence  # Убедитесь, что эта функция импортирована
from constraints_operator import collect_assembly_settings

def main(flag):
    # Выполняем анализ сборки и получаем необходимые данные
    #flag используется для того, чтобы выбирать между обычным и оптимизированным вариантом работы
    intersection_geometry, sequences, topologyMatrix = asm_analysis()
    adjacency_matrix = topologyMatrix.matrix
    assembly_settings = collect_assembly_settings()

    # Упрощаем матрицу смежности
    if flag:
        simplified_matrix = simplify_adjacency_matrix(assembly_settings, adjacency_matrix)
        all_parts, graph, first_detail, leaf_nodes, all_sequences = process_adjacency_data(simplified_matrix)
    else:
        all_parts, graph, first_detail, leaf_nodes, all_sequences = process_adjacency_data(adjacency_matrix)

    # Фильтруем допустимые последовательности
    valid_sequences = filter_valid_sequences(adjacency_matrix, sequences, assembly_settings) 
    full_sequence = restore_full_sequence(assembly_settings, all_sequences)

    return full_sequence

main()