"""
Service MQTT pour IPWatch Backend
Envoie des commandes MQTT aux agents installés sur les machines
"""
import paho.mqtt.client as mqtt
import json
import logging
from typing import Optional
import os

logger = logging.getLogger(__name__)

# Configuration MQTT (à charger depuis config.yaml ou variables d'environnement)
MQTT_BROKER = os.getenv('MQTT_BROKER', 'localhost')
MQTT_PORT = int(os.getenv('MQTT_PORT', '1883'))
MQTT_USERNAME = os.getenv('MQTT_USERNAME', None)
MQTT_PASSWORD = os.getenv('MQTT_PASSWORD', None)


def send_mqtt_command(ip_address: str, command: str) -> bool:
    """
    Envoie une commande MQTT à un équipement

    Args:
        ip_address: Adresse IP de l'équipement
        command: Commande à envoyer (shutdown, reboot, status)

    Returns:
        bool: True si la commande a été envoyée avec succès
    """
    try:
        # Créer le client MQTT
        client = mqtt.Client(client_id=f"ipwatch-backend-{os.getpid()}")

        # Authentification si configurée
        if MQTT_USERNAME and MQTT_PASSWORD:
            client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)

        # Connexion au broker
        client.connect(MQTT_BROKER, MQTT_PORT, keepalive=10)

        # Topic de commande pour l'équipement
        topic = f"ipwatch/device/{ip_address}/command"

        # Payload JSON
        payload = json.dumps({
            "command": command,
            "timestamp": __import__('datetime').datetime.now().isoformat()
        })

        # Publier la commande
        result = client.publish(topic, payload, qos=1)

        # Attendre que le message soit envoyé
        result.wait_for_publish(timeout=5)

        # Déconnexion
        client.disconnect()

        logger.info(f"✓ Commande '{command}' envoyée à {ip_address} via MQTT")
        return result.is_published()

    except Exception as e:
        logger.error(f"✗ Erreur envoi commande MQTT à {ip_address}: {e}")
        return False


def get_device_status(ip_address: str) -> Optional[dict]:
    """
    Récupère le statut d'un équipement via MQTT (si disponible)

    Args:
        ip_address: Adresse IP de l'équipement

    Returns:
        dict: Statut de l'équipement ou None
    """
    # TODO: Implémenter la récupération du statut
    # Nécessite un mécanisme de souscription et d'attente de réponse
    pass
