#!/usr/bin/env python3
import json
import re
import subprocess


def get_simple_sensors():
    try:
        # Führt den originalen 'sensors' Befehl aus
        raw_data = subprocess.check_output(["sensors"], text=True)
    except FileNotFoundError:
        return json.dumps({"error": "Befehl 'sensors' nicht gefunden."}, indent=2)

    devices = {}
    # Teilt die Ausgabe in die einzelnen Hardware-Blöcke
    blocks = raw_data.strip().split("\n\n")

    # Regex-Muster: Sucht nach einer Zahl (optional mit - oder +, optional mit Dezimalpunkt)
    value_pattern = re.compile(r"[-+]?(\d+(?:\.\d+)?)")

    for block in blocks:
        lines = [l.strip() for l in block.split("\n") if l.strip()]
        if not lines:
            continue

        hardware_name = lines[0]
        readings = {}

        for line in lines[1:]:
            # Ignoriere die Adapter-Zeile und Zeilen, die nur Schwellenwerte enthalten
            if line.startswith("Adapter:") or line.startswith("("):
                continue

            if ":" in line:
                sensor, val = line.split(":", 1)
                sensor = sensor.strip()
                val = val.strip()

                # Extrahiere die reine Zahl via Regex
                match = value_pattern.search(val)
                if match:
                    numeric_str = match.group(1)

                    # Konvertierung in float oder int
                    if "." in numeric_str:
                        final_val = float(numeric_str)
                    else:
                        final_val = int(numeric_str)
                else:
                    final_val = val

                readings[sensor] = final_val

        if readings:
            devices[hardware_name] = readings

    # --- AB HIER NEU: NVIDIA GPU Integration ---
    try:
        # Ruft die GPU-Temperatur über nvidia-smi ab
        gpu_temp_raw = subprocess.check_output(
            ["nvidia-smi", "--query-gpu=temperature.gpu", "--format=csv,noheader"],
            text=True
        ).strip()

        if gpu_temp_raw:
            # Fügt den NVIDIA-Block im gleichen Stil wie 'sensors' hinzu
            devices["nvidia_gpu"] = {
                "GPUTemperature": int(gpu_temp_raw)
            }
    except (FileNotFoundError, subprocess.CalledProcessError):
        # Falls nvidia-smi nicht existiert oder fehlschlägt (z.B. keine Nvidia GPU aktiv),
        # wird der Schritt einfach übersprungen.
        pass
    # --- ENDE DER ERWEITERUNG ---

    return json.dumps(devices, indent=2, ensure_ascii=False)


if __name__ == "__main__":
    print(get_simple_sensors())
