import axipy
from typing import List, Union


def extract_line_segments(input_geometry: Union[axipy.Geometry, axipy.ListPoint]) -> List[axipy.Line]:
    line_segments = []

    if isinstance(input_geometry, axipy.ListPoint):
        points_list = list(input_geometry)
        if len(points_list) < 2:
            return line_segments

        for index in range(len(points_list) - 1):
            start_point = points_list[index]
            end_point = points_list[index + 1]
            line_segments.append(axipy.Line(start_point, end_point))

    elif isinstance(input_geometry, axipy.GeometryCollection):
        for geometry_item in input_geometry:
            line_segments.extend(extract_line_segments(geometry_item))

    elif isinstance(input_geometry, axipy.LineString):
        line_segments.extend(extract_line_segments(input_geometry.points))

    elif isinstance(input_geometry, axipy.Polygon):
        line_segments.extend(extract_line_segments(input_geometry.points))

        for hole in input_geometry.holes:
            line_segments.extend(extract_line_segments(hole))

    else:
        raise RuntimeError("Неподдерживаемый тип гоеметрии")

    return line_segments

if axipy.selection_manager.count != 1:
    print("Для выполнения операции выделите ровно один объект")
else:
    target_table = axipy.selection_manager.table
    selected_feature = next(target_table.items(ids=axipy.selection_manager.ids))
    source_geometry = selected_feature.geometry

    error = None
    try:
        generated_segments = extract_line_segments(source_geometry)
    except Exception as ex:
        error = str(ex)

    if error:
        print(error)
    elif not generated_segments:
        print("Объект не содержит линий для разделения")
    else:
        applied_style = selected_feature.style

        if isinstance(applied_style, axipy.CollectionStyle):
            applied_style = applied_style.line
        elif isinstance(applied_style, axipy.PolygonStyle):
            mapinfo_style_string = applied_style.border.to_mapinfo()
            applied_style = axipy.Style.from_mapinfo(mapinfo_style_string)

        if not applied_style:
            applied_style = axipy.Style.from_mapinfo("Pen (1, 2, 0)")

        selected_feature.geometry = None

        new_records = []
        for current_segment in generated_segments:
            segment_feature = axipy.Feature(dict(selected_feature.items()))
            segment_feature.geometry = current_segment
            segment_feature.style = applied_style
            new_records.append(segment_feature)

        target_table.insert(new_records)

        original_feature_id = selected_feature.id
        from PySide2.QtCore import QTimer
        QTimer.singleShot(100, lambda fid=original_feature_id: target_table.remove(fid))

        print(f"Объект успешно разделён на {len(new_records)} отрезков") 

