import badge
import ugfx
import time

CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{};:',.<>/?|\\\"~` .:"
CHAR_LIST = list(CHARS)

def get_input(prompt, maxlen=64):
    ugfx.clear(ugfx.WHITE)
    ugfx.text(10, 10, prompt, ugfx.BLACK)
    input_str = ""
    char_idx = 0
    while True:
        ugfx.clear(ugfx.WHITE)
        ugfx.text(10, 10, prompt, ugfx.BLACK)
        ugfx.text(10, 40, input_str + "_", ugfx.BLACK)
        ugfx.text(10, 70, "Aktuelles Zeichen: " + CHAR_LIST[char_idx], ugfx.BLACK)
        ugfx.text(10, 100, "Links/Rechts = Zeichen wechseln", ugfx.BLACK)
        ugfx.text(10, 120, "Oben = Zeichen einfügen, Unten = löschen", ugfx.BLACK)
        ugfx.text(10, 140, "BACK = Eingabe fertig", ugfx.BLACK)
        badge.eink.update()
        time.sleep(0.1)
        pressed = badge.button.pressed()
        if pressed == badge.BUTTON_LEFT:
            char_idx = (char_idx - 1) % len(CHAR_LIST)
        elif pressed == badge.BUTTON_RIGHT:
            char_idx = (char_idx + 1) % len(CHAR_LIST)
        elif pressed == badge.BUTTON_UP and len(input_str) < maxlen:
            input_str += CHAR_LIST[char_idx]
        elif pressed == badge.BUTTON_DOWN and len(input_str) > 0:
            input_str = input_str[:-1]
        elif pressed == badge.BUTTON_BACK:
            break
    return input_str

def main():
    broker = get_input("MQTT Broker-IP/Hostname eingeben:")
    topic = get_input("MQTT Topic eingeben:")
    message = get_input("MQTT Nachricht eingeben:")
    ugfx.clear(ugfx.WHITE)
    ugfx.text(10, 20, "Verbinde mit MQTT...", ugfx.BLACK)
    badge.eink.update()
    time.sleep(1)
    try:
        from umqtt.simple import MQTTClient
        client = MQTTClient("badge", broker)
        client.connect()
        client.publish(topic, message)
        client.disconnect()
        ugfx.text(10, 40, "MQTT gesendet!", ugfx.BLACK)
    except Exception as e:
        ugfx.text(10, 40, "MQTT Fehler: " + str(e), ugfx.BLACK)
    badge.eink.update()
    time.sleep(3)