from typing import List

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMessageBox, QLabel, QWidget, QHBoxLayout
from bauh.api.abstract.view import MessageType

from bauh.view.util import resource
from bauh.view.qt import css

MSG_TYPE_MAP = {
    MessageType.ERROR: QMessageBox.Critical,
    MessageType.INFO: QMessageBox.Information,
    MessageType.WARNING: QMessageBox.Warning
}


def show_message(title: str, body: str, type_: MessageType, icon: QIcon = QIcon(resource.get_path('img/logo.svg'))):
    popup = QMessageBox()
    popup.setWindowTitle(title)
    popup.setText(body)
    popup.setIcon(MSG_TYPE_MAP[type_])

    if icon:
        popup.setWindowIcon(icon)

    popup.exec_()


def ask_confirmation(title: str, body: str, locale_keys: dict, icon: QIcon = QIcon(resource.get_path('img/logo.svg')), widgets: List[QWidget] = None):
    diag = QMessageBox()
    diag.setIcon(QMessageBox.Question)
    diag.setWindowTitle(title)
    diag.setStyleSheet('QLabel { margin-right: 25px; }')

    wbody = QWidget()
    wbody.setLayout(QHBoxLayout())
    wbody.layout().addWidget(QLabel(body))

    if widgets:
        for w in widgets:
            wbody.layout().addWidget(w)

    diag.layout().addWidget(wbody, 0, 1)

    bt_yes = diag.addButton(locale_keys['popup.button.yes'], QMessageBox.YesRole)
    bt_yes.setStyleSheet(css.OK_BUTTON)

    diag.addButton(locale_keys['popup.button.no'], QMessageBox.NoRole)

    if icon:
        diag.setWindowIcon(icon)

    diag.exec_()

    return diag.clickedButton() == bt_yes
