import paho.mqtt.client as mqtt
import time
import json
import sqlite3

# --- Config ---
BROKER = "localhost"
MQTT_USER = "tonuser"       # remplace par ton vrai user MQTT
MQTT_PASS = "tonmdp"        # remplace par ton vrai mot de passe MQTT
SEUIL_TEMP_MAX = 26.0        # °C, déclenche la clim
SEUIL_NIVEAU_MIN = 20.0      # %, déclenche la pompe
DUREE_MAX_POMPE = 600        # sécurité: 10 min max en continu
TEMPO_ANTI_REBOND = 300      # 5 min avant de re-déclencher une action
DB_PATH = "/home/louj/iot/iot.db"

etat = {
    "temperature": None,
    "niveau_eau": None,
    "pompe_active": False,
    "pompe_depuis": None,
    "clim_active": False,
    "derniere_action_pompe": 0,
    "derniere_action_clim": 0,
}

def log_donnee(capteur, valeur):
    conn = sqlite3.connect(DB_PATH)
    conn.execute(
        "INSERT INTO mesures (capteur, valeur, timestamp) VALUES (?, ?, ?)",
        (capteur, valeur, time.time())
    )
    conn.commit()
    conn.close()

def on_message(client, userdata, msg, properties=None):
    payload = json.loads(msg.payload.decode())
    valeur = payload["valeur"]
    now = time.time()

    if msg.topic == "capteurs/temperature/salon":
        etat["temperature"] = valeur
        log_donnee("temperature", valeur)

        if valeur > SEUIL_TEMP_MAX and not etat["clim_active"]:
            if now - etat["derniere_action_clim"] > TEMPO_ANTI_REBOND:
                client.publish("commandes/clim", json.dumps({"action": "start"}))
                etat["clim_active"] = True
                etat["derniere_action_clim"] = now
                print(f"[ALERTE] Temp {valeur}°C > seuil, clim démarrée")

        elif valeur <= SEUIL_TEMP_MAX - 1 and etat["clim_active"]:
            client.publish("commandes/clim", json.dumps({"action": "stop"}))
            etat["clim_active"] = False

    elif msg.topic == "capteurs/niveau/citerne":
        etat["niveau_eau"] = valeur
        log_donnee("niveau_eau", valeur)

        if etat["pompe_active"] and etat["pompe_depuis"]:
            if now - etat["pompe_depuis"] > DUREE_MAX_POMPE:
                client.publish("commandes/pompe", json.dumps({"action": "stop"}))
                etat["pompe_active"] = False
                print("[SECURITE] Pompe coupée: durée max atteinte")

        if valeur < SEUIL_NIVEAU_MIN and not etat["pompe_active"]:
            if now - etat["derniere_action_pompe"] > TEMPO_ANTI_REBOND:
                client.publish("commandes/pompe", json.dumps({"action": "start"}))
                etat["pompe_active"] = True
                etat["pompe_depuis"] = now
                etat["derniere_action_pompe"] = now
                print(f"[ALERTE] Niveau {valeur}% < seuil, pompe démarrée")

        elif valeur > SEUIL_NIVEAU_MIN + 15 and etat["pompe_active"]:
            client.publish("commandes/pompe", json.dumps({"action": "stop"}))
            etat["pompe_active"] = False

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="seuils-pi-script") #mqtt.Client()
#client.username_pw_set(MQTT_USER, MQTT_PASS)
client.on_message = on_message
client.connect(BROKER, 1883)
client.subscribe("capteurs/#")
print("Script de seuils démarré, en écoute...")
client.loop_forever()
