from PyQt5.QtCore import QObject
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtCore import pyqtSignal

class Converter(QObject):
    def __init__(self, manager, name, description, fileTypes):
        super().__init__()
        self.manager = manager
        self.name = name
        self.description = description
        self.fileTypes = fileTypes
        self.menu = None

    def getFileTypeString(self):
        return ";;".join([self.fileTypes[key] + " (*" + key + ")" for key in self.fileTypes.keys()])

    def showFileSelector(self):
        pass

    def exec(self):
        pass


class Exporter(Converter):
    def __init__(self, manager, name, description, fileTypes):
        super().__init__(manager, name, description, fileTypes)
        self.requirements = []
        self.reqNotMet = "Requirement not met!"

    def showFileSelector(self):
        """Open a dialog to pick the file to save to"""
        path = QFileDialog.getSaveFileName(None, 'Export ' + self.name, '', self.getFileTypeString())[0]
        if path == '' or path is None:
            return
        if not any([path.endswith(ext) for ext in self.fileTypes.keys()]):
            path += list(self.fileTypes.keys())[0] # if they didn't specify a file type, just pick one
        return path

    def exec(self):
        if self.checkRequirements():
            config = None
            if self.menu is not None:
                config = self.menu.exec()
                if config is None:
                    return
            path = self.showFileSelector()
            if path is None:
                return
            self.doConversion(path, config)
        else:
            self.manager.app.outputMessage(self.reqNotMet)

    def doConversion(self, path, config):
        pass

    def checkRequirements(self):
        for req in self.requirements:
            pass


class Importer(Converter):
    def __init__(self, manager, name, description, fileTypes):
        super().__init__(manager, name, description, fileTypes)

    def showFileSelector(self):
        """Open a dialog to pick the file to load"""
        if self.manager.unsavedCheck():
            path = QFileDialog.getOpenFileName(None, 'Import ' + self.name, '', self.getFileTypeString())[0]
            if path != '':
                return path
        return None

    def doConversion(self, path):
        pass

    def exec(self):
        path = self.showFileSelector()
        if path is not None:
            self.doConversion(path)