from PyQt5.QtWidgets import (
    QDialog,
    QDialogButtonBox,
    QVBoxLayout,
    QLabel,
    QGroupBox,
    QGridLayout,
    QLineEdit,
)

from PyQt5 import QtCore


from tmtccmd.core.globals_manager import get_global
from tmtccmd.config.definitions import CoreGlobalIds, CoreModeList


class Parameter:
    def __init__(self, name: str, defaultValue: str, widget: QLineEdit):
        self.name = name
        self.defaultValue = defaultValue
        self.widget = widget
        self.value = self.defaultValue
        self.widget.setPlaceholderText(self.defaultValue)

    def reset(self):
        self.value = self.defaultValue
        self.widget.setPlaceholderText(self.defaultValue)
        self.widget.setText("")


class ParameterDialog(QDialog):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Enter Parameters")

        Buttons = QDialogButtonBox.Ok | QDialogButtonBox.Cancel | QDialogButtonBox.Reset

        self.buttonBox = QDialogButtonBox(Buttons)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)
        self.buttonBox.button(QDialogButtonBox.Reset).clicked.connect(self._reset)

        self.data = 1

        self.rootLayout = QVBoxLayout()
        self.group = QGroupBox("Parameters")
        self.rootLayout.addWidget(self.group)
        self.rootLayout.addWidget(self.buttonBox)
        self.setLayout(self.rootLayout)

        self.groupLayout = QGridLayout()
        self.group.setLayout(self.groupLayout)

        self.parameters = {}

    def addParameter(self, name: str, defaultValue: str):
        row = self.groupLayout.rowCount() + 1
        description = QLabel(name)
        self.groupLayout.addWidget(description, row, 0)
        valueWidget = QLineEdit()
        self.groupLayout.addWidget(valueWidget, row, 1)

        parameter = Parameter(name, defaultValue, valueWidget)

        self.parameters[name] = parameter

    def _reset(self):
        for value in self.parameters.values():
            value.reset()

    def getParameters(self):
        output = {}
        for key, parameter in self.parameters.items():
            if parameter.widget != None:
                if parameter.widget.text() != "":
                    parameter.value = parameter.widget.text()
            output[key] = parameter.value
        return output

    @QtCore.pyqtSlot()
    def reject(self):
        print("reject")
        self._reset()
        super().reject()


"""Prompt the user to specify additional Parameters

    :param parameterList:   array of dictionaries with name and defaultValue attributes
    :return:                dict with all names as key and user supplied input as value string
    """


def prompt_parameters(parameterList):
    gui = get_global(CoreGlobalIds.GUI)
    mode = get_global(CoreGlobalIds.MODE)

    # gui only works in cont mode right now
    if gui and mode == CoreModeList.CONTINUOUS_MODE:
        return _gui_prompt(parameterList)
    else:
        return _cli_prompt(parameterList)


def _gui_prompt(parameterList):
    dialog = ParameterDialog()
    for parameter in parameterList:
        dialog.addParameter(parameter["name"], parameter["defaultValue"])
    dialog.exec_()
    return dialog.getParameters()


def _cli_prompt(parameterList):
    result = {}
    for parameter in parameterList:
        userInput = input(
            "Specify {} [{}]: ".format(parameter["name"], parameter["defaultValue"])
        )
        if userInput == "":
            userInput = parameter["defaultValue"]
        result[parameter["name"]] = userInput
    return result