# Autor Przemysław Kędziorski korsarzz-project.pl
import time
import board
import busio
import displayio
import terminalio
import neopixel
import i2cdisplaybus
import microcontroller
from adafruit_display_text import label
import adafruit_displayio_sh1106

# --- KONFIGURACJA ---
uart_radio = busio.UART(board.GP4, board.GP5, baudrate=9600)
pixels = neopixel.NeoPixel(board.GP15, 8, brightness=0.3, auto_write=True)
displayio.release_displays()
i2c = busio.I2C(board.GP1, board.GP0)
display_bus = i2cdisplaybus.I2CDisplayBus(i2c, device_address=0x3C)
display = adafruit_displayio_sh1106.SH1106(display_bus, width=128, height=64)

# --- OBSŁUGA PAMIĘCI (Tylko do zapamiętania ostatniego stanu) ---
def zapisz_lokalnie(licznik, godzina, minuta):
    microcontroller.nvm[0] = licznik // 256
    microcontroller.nvm[1] = licznik % 256
    microcontroller.nvm[2] = godzina
    microcontroller.nvm[3] = minuta

def wczytaj_lokalnie():
    val = microcontroller.nvm[0] * 256 + microcontroller.nvm[1]
    g = microcontroller.nvm[2]
    m = microcontroller.nvm[3]
    if val > 60000: val = 0; g = 0; m = 0
    return val, g, m

# --- START ---
licznik_love, ost_godz, ost_min = wczytaj_lokalnie()

splash = displayio.Group(); display.root_group = splash
lbl_status = label.Label(terminalio.FONT, text="Szukam...", color=0xFFFFFF, x=2, y=5); splash.append(lbl_status)
linia = displayio.Bitmap(128, 1, 1); tile_linia = displayio.TileGrid(linia, pixel_shader=displayio.Palette(1), x=0, y=12); splash.append(tile_linia)
lbl_msg = label.Label(terminalio.FONT, text="Czuwanie...", color=0xFFFFFF, scale=1); lbl_msg.anchor_point = (0.5, 0.5); lbl_msg.anchored_position = (64, 30); splash.append(lbl_msg)
lbl_info = label.Label(terminalio.FONT, text="...", color=0xFFFFFF, x=2, y=55); splash.append(lbl_info)

czas_ostatniego_sygnalu = 0
czas_wygaszenia_led = 0
KOLOR_CZUWANIE = (0, 0, 20); KOLOR_MILOSC = (255, 0, 0)
pixels.fill(KOLOR_CZUWANIE)

print(f"Start: Znany licznik={licznik_love}")

while True:
    teraz = time.monotonic()
    
    if uart_radio.in_waiting > 0:
        dane = uart_radio.read(64) # Czytamy wiecej
        if dane:
            try:
                tekst = dane.decode("utf-8").strip()
                print("RX:", tekst)
                czas_ostatniego_sygnalu = teraz
                
                # --- FORMAT 1: "LOVE HH:MM LICZNIK" ---
                if "LOVE" in tekst:
                    parts = tekst.split(" ") # ['LOVE', '14:30', '15']
                    
                    # Parsowanie czasu
                    czas_str = parts[1]
                    ost_godz = int(czas_str.split(":")[0])
                    ost_min = int(czas_str.split(":")[1])
                    
                    # Parsowanie licznika
                    licznik_love = int(parts[2])

                    zapisz_lokalnie(licznik_love, ost_godz, ost_min)
                    
                    pixels.fill(KOLOR_MILOSC)
                    lbl_msg.text = "A WLACZYLA\nPUDELECZKO!"
                    czas_wygaszenia_led = teraz + 15
                    
                # --- FORMAT 2: "PING LICZNIK" ---
                elif "PING" in tekst:
                    parts = tekst.split(" ")
                    # Aktualizacja licznika w tle
                    if len(parts) > 1:
                        licznik_love = int(parts[1])
                        zapisz_lokalnie(licznik_love, ost_godz, ost_min)

                    if czas_wygaszenia_led == 0: pixels.fill(KOLOR_CZUWANIE)
            except: pass 
            
    # STATUS ZASIĘGU
    if czas_ostatniego_sygnalu > 0:
        if int(teraz - czas_ostatniego_sygnalu) < 120:
            lbl_status.text = "STATUS: ONLINE <3"
        else:
            lbl_status.text = "STATUS: OFFLINE X"
            if czas_wygaszenia_led == 0: pixels.fill((0,0,0))
    else:
        lbl_status.text = "STATUS: SZUKAM..."

    lbl_info.text = "L:{} | Ost: {:02}:{:02}".format(licznik_love, ost_godz, ost_min)

    if czas_wygaszenia_led > 0 and teraz > czas_wygaszenia_led:
        pixels.fill(KOLOR_CZUWANIE); lbl_msg.text = "Czuwanie..."; czas_wygaszenia_led = 0
    time.sleep(0.1)