import os
import sys
import re
import logging
import logging.config
import importlib.util

from PyQt5 import QtCore, QtGui, QtWidgets

import ostools
from quirks import ScriptQuirks

_datadir = ostools.getDataDir()
logging.config.fileConfig(_datadir + "logging.ini")
PchumLog = logging.getLogger('pchumLogger')

class PythonQuirks(ScriptQuirks):
    def loadModule(self, name, filename):
        # imp is depreciated since Python 3.4
        #return imp.load_source(name, filename)
        
        spec = importlib.util.spec_from_file_location(name, filename)
        module = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(module)
        return module
    
    def getExtension(self):
        return '.py'

    def modHas(self, module, attr):
        if attr == 'commands':
            variables = vars(module)
            for name, obj in variables.items():
                if self.modHas(obj, 'command'):
                    return True
        return hasattr(module, attr)

    def register(self, module):
        variables = vars(module)
        for name, obj in variables.items():
            if self.modHas(obj, 'command'):
                try:
                    if not isinstance(obj("test"), str):
                        raise Exception
                except:
                    #print("Quirk malformed: %s" % (obj.command))
                    PchumLog.error("Quirk malformed: %s" % (obj.command))

                    # Since this is executed before QApplication is constructed,
                    # This prevented pesterchum from starting entirely when a quirk was malformed :/
                    # (QWidget: Must construct a QApplication before a QWidget)
                    
                    if QtWidgets.QApplication.instance() != None:
                        msgbox = QtWidgets.QMessageBox()
                        msgbox.setWindowTitle("Error!")
                        msgbox.setText("Quirk malformed: %s" % (obj.command))
                        msgbox.exec_()
                else:
                    self.quirks[obj.command] = obj

