import base64
from pathlib import Path

from PySide6.QtCore import QCoreApplication, QThread, QSize, Qt
from PySide6.QtGui import QScreen, QPixmap, QPainter, QPalette, QIcon, QColor, QImage
from PySide6.QtWidgets import QMainWindow, QApplication, QWidget, QDialog


def move_window_to_center(window: QMainWindow | QDialog) -> None:
    main_screen = QApplication.primaryScreen()
    center = QScreen.availableGeometry(main_screen).center()
    geometry = window.frameGeometry()
    geometry.moveCenter(center)
    window.move(geometry.topLeft())

def is_main_thread() -> bool:
    app = QCoreApplication.instance()
    return app is not None and QThread.currentThread() == app.thread()

# ======================== AI generated ========================
def recolor_standard_icon(widget, standard_pixmap, size=24):
    source_icon = widget.style().standardIcon(standard_pixmap)
    source = source_icon.pixmap(QSize(size, size))

    result = QPixmap(source.size())
    result.fill(Qt.GlobalColor.transparent)

    painter = QPainter(result)
    painter.drawPixmap(0, 0, source)
    painter.setCompositionMode(
        QPainter.CompositionMode.CompositionMode_SourceIn
    )
    painter.fillRect(
        result.rect(),
        widget.palette().color(QPalette.ColorRole.ButtonText),
    )
    painter.end()

    return QIcon(result)

def recolor_pixmap(
    path: str | Path,
    color: QColor | None = None,
) -> QPixmap:
    source = QPixmap(str(path))

    if source.isNull():
        raise FileNotFoundError(f"Unable to load image: {path}")

    if color is None:
        color = QApplication.palette().color(
            QPalette.ColorRole.ButtonText
        )

    result = QPixmap(source.size())
    result.setDevicePixelRatio(source.devicePixelRatio())
    result.fill(Qt.GlobalColor.transparent)

    painter = QPainter(result)
    painter.drawPixmap(0, 0, source)
    painter.setCompositionMode(
        QPainter.CompositionMode.CompositionMode_SourceIn
    )
    painter.fillRect(result.rect(), color)
    painter.end()

    return result


def recolor_icon(
    path: str | Path,
    color: QColor | None = None,
) -> QIcon:
    return QIcon(recolor_pixmap(path, color))

def is_light_theme(widget=None) -> bool:
    palette = (
        widget.palette()
        if widget is not None
        else QApplication.palette()
    )

    color = palette.color(QPalette.ColorRole.Window)

    luminance = (
        0.2126 * color.redF()
        + 0.7152 * color.greenF()
        + 0.0722 * color.blueF()
    )

    return luminance >= 0.5

def add_icon_padding(icon: QIcon, icon_size=32, padding=6) -> QIcon:
    source = icon.pixmap(icon_size, icon_size)

    canvas_size = icon_size + padding * 2
    canvas = QPixmap(canvas_size, canvas_size)
    canvas.fill(Qt.GlobalColor.transparent)

    painter = QPainter(canvas)
    painter.drawPixmap(padding, padding, source)
    painter.end()

    return QIcon(canvas)

def data_url_to_qt_image(data_url: str) -> QImage:
    try:
        header, encoded_data = data_url.split(",", 1)
    except ValueError:
        raise ValueError("Not a valid data url")

    if ";base64" not in header:
        raise ValueError("Unsupported data url. Supported data urls are base64")

    try:
        image_data = base64.b64decode(encoded_data, validate=True)
    except ValueError as error:
        raise ValueError("Invalid image data") from error

    image = QImage.fromData(image_data)

    if image.isNull():
        raise ValueError("Qt does not support this image")

    return image

# ======================== AI generated END ========================