import paho.mqtt.client as mqtt
import json
import uuid
import logging
import os
import sys

# Íàñòðîéêà ëîãèðîâàíèÿ
logging.basicConfig(filename='mqtt_client.log', level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s')

# Íàñòðîéêè MQTT
MQTT_BROKER = "191.101.2.61"
MQTT_PORT = 1883
MQTT_USERNAME = 'szm'
MQTT_PASSWORD = 'sdda8jKHks3'
MQTT_CLIENT_ID = str(uuid.uuid4())
MQTT_TOPICS_SUB = [
    ("grand_beton/ttn/1", 0), 
    ("grand_beton/ttn/2", 0), 
    ("grand_beton/ttn/4", 0),
    ("grand_beton/ttn/8", 0),
    ("grand_beton/ttn/16", 0),
    ("grand_beton/ttn/32", 0),
    ("grand_beton/ttn/64", 0),
    ("grand_beton/ttn/128", 0),
    ("grand_beton/ttn/256", 0),
    ("grand_beton/ttn/512", 0)
]

# Ñëîâàðü äëÿ õðàíåíèÿ îáúåêòîâ ïî id
objects_by_id = {}

# Callback ïðè ïîäêëþ÷åíèè ê MQTT áðîêåðó
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        logging.info("Connected successfully")
        # Ïîäïèñêà íà âñå òîïèêè
        for topic, qos in MQTT_TOPICS_SUB:
            client.subscribe(topic, qos)
    else:
        logging.error(f"Connection error: {rc}")

# Callback ïðè ïîëó÷åíèè ñîîáùåíèÿ
def on_message(client, userdata, msg):
    try:
        payload = json.loads(msg.payload.decode())
        obj_id = payload.get("id")
        obj_status = payload.get("st")

        if obj_id is not None:
            # Ñîõðàíÿåì îáúåêòû ïî id â ñëîâàðå
            if obj_id not in objects_by_id:
                objects_by_id[obj_id] = []

            # Îáíîâëÿåì ñòàòóñ îáúåêòà â ñîîòâåòñòâóþùåì òîïèêå
            objects_by_id[obj_id].append((msg.topic, obj_status, payload))

            # Ïðîâåðÿåì, åñòü ëè îáúåêò ñ st == 4
            if obj_status == 4:
                update_status_for_other_topics(obj_id, msg.topic, client)
                
    except Exception as e:
        logging.error(f"Message processing error: {e}")

# Ôóíêöèÿ äëÿ îáíîâëåíèÿ ñòàòóñà äðóãèõ òîïèêîâ
def update_status_for_other_topics(obj_id, topic_with_st_4, client):
    if obj_id in objects_by_id:
        for topic, status, payload in objects_by_id[obj_id]:
            if topic != topic_with_st_4 and status != 4:
                # Îáíîâëÿåì ïîëå st íà 6 äëÿ âñåõ äðóãèõ òîïèêîâ ñ òåì æå id
                payload['st'] = 6
                client.publish(topic, json.dumps(payload), qos=0)
                logging.info(f"Updated id={obj_id} in topic {topic}, set st=6")

def start_mqtt_client_del():
    client = mqtt.Client(client_id=MQTT_CLIENT_ID)
    client.on_connect = on_connect
    client.on_message = on_message
    client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)
    client.connect(MQTT_BROKER, MQTT_PORT, 60)
    client.loop_start()
    return client
    
lock_file = '/tmp/mqtt_client_del.lock'

if os.path.exists(lock_file):
    print("MQTT client is already running. PROJ")
    sys.exit()

# Ñîçäàíèå ôàéëà áëîêèðîâêè
with open(lock_file, 'w') as f:
    f.write(str(os.getpid()))

try:
    # Çàïóñê MQTT êëèåíòà
    start_mqtt_client_del()
finally:
    # Óäàëåíèå ôàéëà áëîêèðîâêè ïðè çàâåðøåíèè ðàáîòû
    if os.path.exists(lock_file):
        os.remove(lock_file)
