# -*- coding: utf-8 -*-
"""CPU- / RAM-Auslastung mit kleinen Balken."""
import psutil
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtGui import QPainter, QColor, QLinearGradient, QFont
from PyQt5.QtWidgets import QVBoxLayout, QHBoxLayout, QLabel, QWidget, QSizePolicy

from modules.base import DashboardModule


class Bar(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.value = 0.0
        self.setMinimumHeight(8)
        self.setMaximumHeight(8)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)

    def set_value(self, v: float):
        self.value = max(0.0, min(100.0, v))
        self.update()

    def paintEvent(self, _):
        p = QPainter(self)
        p.setRenderHint(QPainter.Antialiasing, True)
        r = self.rect()
        # Hintergrund
        p.setPen(Qt.NoPen)
        p.setBrush(QColor(255, 255, 255, 24))
        p.drawRoundedRect(r, 4, 4)
        # Füllung
        if self.value > 0:
            w = int(r.width() * self.value / 100.0)
            grad = QLinearGradient(0, 0, r.width(), 0)
            grad.setColorAt(0.0, QColor("#00E5FF"))
            grad.setColorAt(0.6, QColor("#7CFF00"))
            grad.setColorAt(1.0, QColor("#FF00C8"))
            p.setBrush(grad)
            p.drawRoundedRect(0, 0, w, r.height(), 4, 4)


class SystemInfoModule(DashboardModule):
    def __init__(self, parent=None):
        super().__init__(parent)
        outer = QVBoxLayout(self)
        outer.setContentsMargins(2, 2, 2, 2)
        outer.setSpacing(6)

        self.cpu_lbl, self.cpu_bar = self._row("CPU")
        self.ram_lbl, self.ram_bar = self._row("RAM")

        for lbl, bar in [(self.cpu_lbl, self.cpu_bar), (self.ram_lbl, self.ram_bar)]:
            row = QVBoxLayout()
            row.setSpacing(2)
            row.addWidget(lbl)
            row.addWidget(bar)
            outer.addLayout(row)

        # Erster CPU-Wert ist 0 — psutil braucht ein Intervall
        psutil.cpu_percent(interval=None)
        self._timer = QTimer(self)
        self._timer.timeout.connect(self._refresh)
        self._timer.start(1500)

    def _row(self, name: str):
        lbl = QLabel(f"{name}  --%")
        f = QFont("Segoe UI", 9)
        f.setBold(True)
        lbl.setFont(f)
        lbl.setStyleSheet("color: #E8F4FF; letter-spacing: 0.5px;")
        bar = Bar()
        return lbl, bar

    def _refresh(self):
        cpu = psutil.cpu_percent(interval=None)
        ram = psutil.virtual_memory().percent
        self.cpu_lbl.setText(f"CPU  {cpu:5.1f} %")
        self.ram_lbl.setText(f"RAM  {ram:5.1f} %")
        self.cpu_bar.set_value(cpu)
        self.ram_bar.set_value(ram)


MODULE_TITLE = "System (CPU/RAM)"
MODULE_CLASS = SystemInfoModule
