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)
