import os
import sys

import maya.mel as mel
import pymel.core as pm
import maya.utils as mu
import maya.cmds as cmds
import maya.OpenMaya as om
import maya.OpenMayaMPx as ompx

# first instantiatet the global spore dispatcher class
# this must be the first thing bevore we import any of the plugins
import dispatcher
reload(dispatcher)
sys._global_spore_dispatcher = dispatcher.GlobalSporeDispatcher()

# now we can import the spore plugins
import AEsporeNodeTemplate
from scripted import spore_node
from scripted import spore_context
from scripted import spore_command
from scripted import spore_sampler

if os.environ.get('SPORE_DEV_MODE', '0') == '1':
    reload(spore_node)
    reload(spore_context)
    reload(spore_command)
    reload(spore_sampler)
    reload(AEsporeNodeTemplate)
    mel.eval('refreshEditorTemplates;')


def initializePlugin(mobject):
    """ initialize plugins. this is the entry point for spore.
    as soon as maya loads the spore plugin the initializePlugin function is
    called which is also triggers everythin to set up. """

    sys._global_spore_dispatcher.logger.debug('Loading Spore plugin')
    mplugin = ompx.MFnPlugin(mobject, 'Anno Schachner', 'v0.1.0.beta')

    try: # register node prototype
        mplugin.registerNode(spore_node.SporeNode.name,
                             spore_node.SporeNode.id,
                             spore_node.SporeNode.creator,
                             spore_node.SporeNode.initialize,
                             ompx.MPxLocatorNode.kLocatorNode)
                             #  ompx.MPxNode.kDependNode)
    except:
        sys.stderr.write("Failed to register node: %s" % spore_node.SporeNode.name)
        raise

    try: # register context & tool command
        mplugin.registerContextCommand(spore_context.K_CONTEXT_NAME,
                                       spore_context.SporeContextCommand.creator,
                                       spore_context.K_TOOL_CMD_NAME,
                                       spore_context.SporeToolCmd.creator,
                                       spore_context.SporeToolCmd.syntax)
    except:
        sys.stderr.write("Failed to register context command: {}".format(spore_context.K_CONTEXT_NAME))
        raise

    try: # register spore command
        mplugin.registerCommand(spore_command.SporeCommand.name,
                                spore_command.SporeCommand.creator,
                                spore_command.SporeCommand.syntax)
    except:
        sys.stderr.write('Failed to register spore command: {}'.format(spore_command.SporeCommand.name))

    try: # register sample command
        mplugin.registerCommand(spore_sampler.SporeSampler.name,
                                spore_sampler.creator,
                                spore_sampler.syntax)
    except:
        sys.stderr.write('Failed to register spore command: {}'.format(spore_sampler.SporeSampler.name))
        raise


def uninitializePlugin(mobject):
    """ uninitialize plugins in reverse order & delete menu """

    sys._global_spore_dispatcher.logger.debug('Unloading Spore plugin')
    mplugin = ompx.MFnPlugin(mobject)

    try:
        mplugin.deregisterCommand(spore_sampler.SporeSampler.name)
    except:
        sys.stderr.write("Failed to deregister command: %s" % spore_sampler.SporeSampler.name)
        raise

    try:
        mplugin.deregisterCommand(spore_command.SporeCommand.name)
    except:
        sys.stderr.write("Failed to deregister command: %s" % spore_command.SporeCommand.name)
        raise

    try: # deregister context and tool command
        mplugin.deregisterContextCommand(spore_context.K_CONTEXT_NAME,
                                         spore_context.K_TOOL_CMD_NAME)
    except:
        sys.stderr.write("Failed to deregister node: %s" % spore_context.K_CONTEXT_NAME)
        raise

    try: # deregister spore node
        mplugin.deregisterNode(spore_node.SporeNode.id)
    except:
        sys.stderr.write("Failed to deregister node: %s" % spore_node.SporeNode.name)
        raise

    sys._global_spore_dispatcher.clean_up()
    del sys._global_spore_dispatcher