import time

import lnx
import lnx.log
import lnx.nodes_logic
import lnx.nodes_material
import lnx.props_traits_props
import lnx.props_traits
import lnx.props_lod
import lnx.props_action
import lnx.props_tilesheet
import lnx.props_exporter
import lnx.props_bake
import lnx.props_renderpath
import lnx.props_properties
import lnx.props_collision_filter_mask
import lnx.props
import lnx.props_ui
import lnx.handlers
import lnx.utils
import lnx.keymap

reload_started = 0

if lnx.is_reload(__name__):
    lnx.log.debug('Reloading Leenkx SDK...')
    reload_started = time.time()

    # Clear the module cache
    import importlib
    lnx = importlib.reload(lnx)  # type: ignore

    lnx.nodes_logic = lnx.reload_module(lnx.nodes_logic)
    lnx.nodes_material = lnx.reload_module(lnx.nodes_material)
    lnx.props_traits_props = lnx.reload_module(lnx.props_traits_props)
    lnx.props_traits = lnx.reload_module(lnx.props_traits)
    lnx.props_lod = lnx.reload_module(lnx.props_lod)
    lnx.props_action = lnx.reload_module(lnx.props_action)
    lnx.props_tilesheet = lnx.reload_module(lnx.props_tilesheet)
    lnx.props_exporter = lnx.reload_module(lnx.props_exporter)
    lnx.props_bake = lnx.reload_module(lnx.props_bake)
    lnx.props_renderpath = lnx.reload_module(lnx.props_renderpath)
    lnx.props_properties = lnx.reload_module(lnx.props_properties)
    lnx.props_collision_filter_mask = lnx.reload_module(lnx.props_collision_filter_mask)
    lnx.props = lnx.reload_module(lnx.props)
    lnx.props_ui = lnx.reload_module(lnx.props_ui)
    lnx.handlers = lnx.reload_module(lnx.handlers)
    lnx.utils = lnx.reload_module(lnx.utils)
    lnx.keymap = lnx.reload_module(lnx.keymap)
else:
    lnx.enable_reload(__name__)

registered = False


def register(local_sdk=False):
    global registered
    registered = True
    lnx.utils.register(local_sdk=local_sdk)
    lnx.props_traits_props.register()
    lnx.props_traits.register()
    lnx.props_lod.register()
    lnx.props_action.register()
    lnx.props_tilesheet.register()
    lnx.props_exporter.register()
    lnx.props_bake.register()
    lnx.props_renderpath.register()
    lnx.props_properties.register()
    lnx.props.register()
    lnx.props_ui.register()
    lnx.nodes_logic.register()
    lnx.nodes_material.register()
    lnx.keymap.register()
    lnx.handlers.register()
    lnx.props_collision_filter_mask.register()

    lnx.handlers.post_register()

    if reload_started != 0:
        lnx.log.debug(f'Leenkx SDK: Reloading finished in {time.time() - reload_started:.3f}s')


def unregister():
    global registered
    registered = False
    lnx.keymap.unregister()
    lnx.utils.unregister()
    lnx.nodes_material.unregister()
    lnx.nodes_logic.unregister()
    lnx.handlers.unregister()
    lnx.props_ui.unregister()
    lnx.props.unregister()
    lnx.props_traits_props.unregister()
    lnx.props_traits.unregister()
    lnx.props_action.unregister()
    lnx.props_lod.unregister()
    lnx.props_tilesheet.unregister()
    lnx.props_exporter.unregister()
    lnx.props_bake.unregister()
    lnx.props_renderpath.unregister()
    lnx.props_properties.unregister()
    lnx.props_collision_filter_mask.unregister()