import bpy, mathutils
from . import UTILS_functions

class BALLANCE_OT_add_rails(bpy.types.Operator):
    """Add rail"""
    bl_idname = "ballance.add_rails"
    bl_label = "Add rail section"
    bl_options = {'UNDO'}

    rail_type: bpy.props.EnumProperty(
        name="Type",
        description="Rail type",
        items=(('MONO', "Monorail", ""),
                ('DOUBLE', "Rail", ""),
                ),
    )

    rail_radius: bpy.props.FloatProperty(
        name="Rail radius",
        description="Define rail section radius",
        default=0.375,
    )

    rail_span: bpy.props.FloatProperty(
        name="Rail span",
        description="Define rail span",
        default=3.75,
    )

    def execute(self, context):
        bpy.ops.object.select_all(action='DESELECT')
        # create one first
        bpy.ops.mesh.primitive_circle_add(vertices=8,
                                        radius=self.rail_radius,
                                        fill_type='NOTHING',
                                        calc_uvs=False,
                                        enter_editmode=False,
                                        align='WORLD',
                                        location=(0.0, 0.0, 0.0))

        firstObj = bpy.context.selected_objects[0]

        # for double rail
        if self.rail_type == 'DOUBLE':
            bpy.ops.object.select_all(action='DESELECT')
            bpy.ops.mesh.primitive_circle_add(vertices=8,
                                            radius=self.rail_radius,
                                            fill_type='NOTHING',
                                            calc_uvs=False,
                                            enter_editmode=False,
                                            align='WORLD',
                                            location=(self.rail_span, 0.0, 0.0))
            secondObj = bpy.context.selected_objects[0]

            # merge
            bpy.ops.object.select_all(action='DESELECT')
            bpy.context.view_layer.objects.active = firstObj
            firstObj.select_set(True)
            secondObj.select_set(True)
            bpy.ops.object.join()

        # apply 3d cursor
        UTILS_functions.move_to_cursor(firstObj)

        return {'FINISHED'}

    def invoke(self, context, event):
        wm = context.window_manager
        return wm.invoke_props_dialog(self)

    def draw(self, context):
        layout = self.layout
        layout.prop(self, "rail_type")
        layout.prop(self, "rail_radius")
        if self.rail_type == 'DOUBLE':
            layout.prop(self, "rail_span")