# SPDX-License-Identifier: GPL-2.0-or-later

import bpy
from bpy.props import BoolProperty
from bpy.types import Operator, Panel
from . import surfaces
from . import curves
from . import util


class OperatorAutoLoftCurves(Operator):
    bl_idname = "curvetools.create_auto_loft"
    bl_label = "Loft"
    bl_description = "Lofts selected curves"
    bl_options = {'UNDO'}

    @classmethod
    def poll(cls, context):
        return util.Selected2Curves()

    def execute(self, context):
        #print("### TODO: OperatorLoftcurves.execute()")
        mesh = bpy.data.meshes.new("LoftMesh")

        curve0 = context.selected_objects[0]
        curve1 = context.selected_objects[1]

        ls = surfaces.LoftedSurface(curves.Curve(curve0), curves.Curve(curve1), "AutoLoft")

        ls.bMesh.to_mesh(mesh)

        loftobj = bpy.data.objects.new(self.name, mesh)

        context.collection.objects.link(loftobj)
        loftobj["autoloft"] = True
        ui_data = loftobj.id_properties_ui("autoloft")
        ui_data.update(description="Auto loft from %s to %s" % (curve0.name, curve1.name))
        loftobj["autoloft_curve0"] = curve0.name
        loftobj["autoloft_curve1"] = curve1.name

        return {'FINISHED'}

class AutoLoftModalOperator(Operator):
    """Auto Loft"""
    bl_idname = "curvetools.update_auto_loft_curves"
    bl_label = "Update Auto Loft"
    bl_description = "Update Lofts selected curves"

    _timer = None
    @classmethod
    def poll(cls, context):
        # two curves selected.
        return True

    def execute(self, context):
        scene = context.scene
        lofters = [o for o in scene.objects if "autoloft" in o.keys()]
        # quick hack
        #print("TIMER", lofters)

        for loftmesh in lofters:
            curve0 = scene.objects.get(loftmesh['autoloft_curve0'])
            curve1 = scene.objects.get(loftmesh['autoloft_curve1'])
            if curve0 and curve1:
                ls = surfaces.LoftedSurface(curves.Curve(curve0), curves.Curve(curve1), loftmesh.name)
                ls.bMesh.to_mesh(loftmesh.data)
        return {'FINISHED'}

def register():
    bpy.utils.register_class(AutoLoftModalOperator)
    bpy.utils.register_class(OperatorAutoLoftCurves)
    bpy.types.WindowManager.auto_loft = BoolProperty(default=False,
                                                     name="Auto Loft")
    bpy.context.window_manager.auto_loft = False

def unregister():
    bpy.utils.unregister_class(AutoLoftModalOperator)
    bpy.utils.unregister_class(OperatorAutoLoftCurves)

if __name__ == "__main__":
    register()
