from PySide6.QtCore import Qt, QTimer
from PySide6.QtWidgets import QLabel


def _is_alive_widget(widget):
    try:
        widget.isVisible()
        return True
    except RuntimeError:
        return False
    except (AttributeError, TypeError):
        return False


def _is_alive_timer(timer):
    try:
        timer.isActive()
        return True
    except RuntimeError:
        return False
    except (AttributeError, TypeError):
        return False


def _resolve_style(level):
    key = str(level or "").strip().lower()
    styles = {
        "success": "background-color: rgba(33, 115, 70, 230); color: #ffffff;",
        "warning": "background-color: rgba(180, 120, 0, 230); color: #ffffff;",
        "error": "background-color: rgba(156, 34, 34, 235); color: #ffffff;",
        "info": "background-color: rgba(30, 35, 40, 225); color: #ffffff;",
        "information": "background-color: rgba(30, 35, 40, 225); color: #ffffff;",
    }
    return styles.get(key, styles["info"])


def show_global_toast(parent, message, duration_ms=1400, level="info", bottom_margin=22):
    if parent is None:
        return

    text = str(message or "").strip()
    if not text:
        return

    label = getattr(parent, "_global_toast_label", None)
    if not label or not _is_alive_widget(label):
        label = QLabel(parent)
        label.setAttribute(Qt.WA_TransparentForMouseEvents, True)
        label.setAlignment(Qt.AlignCenter)
        label.setWordWrap(False)
        label.setTextInteractionFlags(Qt.NoTextInteraction)
        label.setObjectName("global_ui_toast")
        setattr(parent, "_global_toast_label", label)

    style = _resolve_style(level)
    label.setStyleSheet(
        f"{style} border-radius: 8px; padding: 6px 14px; font-weight: 600; font-size: 11px;"
    )
    label.setText(text)
    label.adjustSize()

    parent_rect = parent.rect()
    x_pos = int((parent_rect.width() - label.width()) / 2)
    y_pos = int(parent_rect.height() - label.height() - max(int(bottom_margin or 0), 8))
    x_pos = max(8, x_pos)
    y_pos = max(8, y_pos)
    label.move(x_pos, y_pos)
    label.raise_()
    label.show()

    timer = getattr(parent, "_global_toast_timer", None)
    if not timer or not _is_alive_timer(timer):
        timer = QTimer(parent)
        timer.setSingleShot(True)
        timer.timeout.connect(label.hide)
        setattr(parent, "_global_toast_timer", timer)
    elif timer.isActive():
        timer.stop()

    timer.start(max(int(duration_ms or 0), 600))
