#!/usr/bin/env python3

import os
import sys
import pygame
import paho.mqtt.client as mqtt
import random

class ScrollingTextDisplay:
    def __init__(self, width: int, height: int):
        pygame.init()
        self.width = width
        self.height = height
        self.screen = pygame.Surface((width, height))
        self.clock = pygame.time.Clock()

        # Liste der Standardtexte
        self.default_texts = [
            "Text per MQTT an: mqtt.chaospott.de Topic: test/topic ",  # Hardcodierte IP-Adresse
            "Willkommen beim MQTT-Display!",
            "Aktuelle Nachrichten hier empfangen.",
            "MQTT-Server verbindet...",
            "Textnachricht anzeigen...",
        ]
        self.error_text = "MQTT-Server nicht erreichbar!"
        self.text = self.get_random_default_text()  # Zufälligen Standardtext auswählen
        self.text_x = width

        # Schriftart 'PressStart2P-Regular' aus dem Verzeichnis 'apps' laden
        self.font = pygame.font.Font("PressStart2P-Regular.ttf", 16)  # Schriftgröße anpassen

        # Fest codierte MQTT-Einstellungen
        self.mqtt_broker = "mqtt.chaospott.de"  # Beispiel IP-Adresse des MQTT-Brokers
        self.topic = "test/topic"       # Beispiel Topic
        self.mqtt_client = mqtt.Client()
        self.mqtt_client.on_connect = self.on_connect
        self.mqtt_client.on_message = self.on_message
        self.mqtt_client.on_disconnect = self.on_disconnect

        # Versuche die Verbindung aufzubauen
        self.connect_to_mqtt()

        # Zähler für die angezeigte Nachricht
        self.message_display_count = 0

    def get_random_default_text(self):
        """Wählt zufällig einen Standardtext aus der Liste aus."""
        return random.choice(self.default_texts)

    def connect_to_mqtt(self):
        try:
            self.mqtt_client.connect(self.mqtt_broker)
            self.mqtt_client.loop_start()
        except Exception as e:
            print(f"Verbindungsfehler zu MQTT-Server: {e}")
            self.text = self.error_text  # Setze Fehlertext für die Anzeige
            self.text_x = self.width  # Text von rechts starten

    def on_connect(self, client, userdata, flags, rc):
        if rc == 0:
            client.subscribe(self.topic)
            self.text = self.get_random_default_text()  # Setze einen zufälligen Standardtext
        else:
            print(f"Fehler beim Verbinden mit MQTT: Code {rc}")
            self.text = self.error_text

    def on_disconnect(self, client, userdata, rc):
        if rc != 0:
            print("Verbindung zum MQTT-Server verloren. Erneuter Verbindungsversuch...")
            self.text = self.error_text
            self.text_x = self.width  # Fehlertext von rechts starten
            # Erneut die Verbindung aufbauen
            self.connect_to_mqtt()

    def on_message(self, client, userdata, msg):
        self.text = msg.payload.decode("utf-8") if msg.payload.decode("utf-8") else self.get_random_default_text()
        self.text_x = self.width  # Text von rechts starten
        self.message_display_count = 3  # Setze den Zähler auf 3

    def draw_text(self):
        self.screen.fill((0, 0, 0))  # Bildschirm leeren
        text_surface = self.font.render(self.text, True, (255, 255, 255))
        text_width = text_surface.get_width()  # Breite des Textes ermitteln
        text_y = (self.height - text_surface.get_height()) // 2  # Y-Position zentrieren
        self.screen.blit(text_surface, (self.text_x, text_y))  # Text zentriert zeichnen

    def display(self):
        while True:
            text_surface = self.font.render(self.text, True, (255, 255, 255))
            text_width = text_surface.get_width()  # Breite des Textes ermitteln

            self.text_x -= 1  # Text nach links verschieben
            if self.text_x < -text_width:  # Wenn der Text komplett verschwunden ist
                self.text_x = self.width  # Text von rechts neu starten
                # Falls der Text leer ist, setze Standardtext oder Fehlertext
                if self.message_display_count > 0:
                    self.message_display_count -= 1
                else:
                    self.text = self.get_random_default_text()  # Setze zurück auf zufälligen Standardtext

            self.draw_text()
            os.write(1, pygame.image.tostring(self.screen, "RGB"))
            self.clock.tick(30)

if __name__ == "__main__":
    Nx = int(sys.argv[1])  # Breite des Displays
    Ny = int(sys.argv[2])  # Höhe des Displays

    display = ScrollingTextDisplay(Nx, Ny)
    display.display()

