import threading
import queue
import time
from shared import get_lora, deviceTypes

# --- Lecture de l'ID unique du Raspberry Pi ---
try:
    with open("device_id.txt", "r") as f:
        DEVICE_ID = f.read().strip()
except Exception:
    # Alternative si le script est lancé depuis un autre dossier
    try:
        with open("/home/pi/SmartWave/orchestrateur/device_id.txt", "r") as f:
            DEVICE_ID = f.read().strip()
    except Exception:
        DEVICE_ID = "RPI_Orchestrateur_Default"

# Création de la file d'attente pour les messages (thread-safe)
data_queue = queue.Queue()

lora = get_lora()
lora.configure()

def lora_listener():
    """Thread de fond : écoute en permanence et répond aux Heartbeats."""
    print("Thread Écouteur démarré.")
    while True:
        # On attend un paquet (timeout court pour rester réactif)
        paquet = lora.receive_packet(timeout_ms=1000)
        
        if paquet:
            donnees = paquet["data"]
            expediteur_type = donnees.get("type")
            
            # --- Cas 1 : Gestion automatique du Heartbeat ---
            if expediteur_type == deviceTypes.DEVICE_TYPES["MICROWAVE"]:
                print(f"\n[Thread Fond] Heartbeat reçu de {donnees.get('id')}")
                
                reponse = {
                    "id": DEVICE_ID, # Ou lecture de ton fichier device_id.txt
                    "type": deviceTypes.DEVICE_TYPES["ORCHESTRATOR"]
                }
                lora.send(reponse)
                
            # --- Cas 2 : Donnée applicative, on l'envoie vers le thread principal ---
            else:
                data_queue.put(paquet)

# 2. Lancement du thread d'écoute
listener_thread = threading.Thread(target=lora_listener, daemon=True)
listener_thread.start()

# 3. Boucle principale (Main Thread) : tu es libre de faire autre chose !
print("Orchestrateur prêt. Le main loop est libre.")
while True:
    try:
        # On regarde si on a reçu des données applicatives (non-heartbeat)
        # On utilise block=False pour ne pas bloquer si la queue est vide
        try:
            msg = data_queue.get(block=False)
            print(f"\n[Main Loop] Données traitées : {msg['data']}")
        except queue.Empty:
            pass # Rien à traiter, on fait autre chose...
            
        # Ici tu peux faire tes autres tâches
        time.sleep(1)
        
    except KeyboardInterrupt:
        break