"""
Backend principal para el Sistema de Lectura Automática de Medidores.

Este módulo gestiona múltiples conexiones de medidores y coordina el sistema general.
Proporciona métodos para añadir, eliminar y listar conexiones, así como para verificar su estado.

Desarrolladores:
- Para modificar la gestión general de conexiones, ajuste los métodos de la clase MeterReadingBackend
- Si se necesitan nuevas funcionalidades a nivel de sistema, añádalas aquí
"""

import threading
from meter_connection import MeterConnection
from alert_system import AlertSystem
from colorama import Fore, Style

class MeterReadingBackend:
    def __init__(self):
        self.connections = []
        self.alert_system = AlertSystem()

    def add_connection(self, host, port, mode, meter_type, interrogation_enabled=False, interrogation_frequency=60):
        """
        Añade una nueva conexión de medidor al backend.

        Args:
            host (str): Dirección IP del medidor.
            port (int): Puerto del medidor.
            mode (str): Modo de conexión ("client" o "server").
            meter_type (str): Tipo de protocolo del medidor.
            interrogation_enabled (bool): Si se debe interrogar activamente al medidor.
            interrogation_frequency (int): Frecuencia de interrogación en segundos.
        """
        connection = MeterConnection(host, port, mode, meter_type, self.alert_system, interrogation_enabled, interrogation_frequency)
        self.connections.append(connection)
        threading.Thread(target=self.run_connection, args=(connection,), daemon=True).start()
        print(f"{Fore.GREEN}Conexión añadida: {host}:{port}{Style.RESET_ALL}")

    def remove_connection(self, index):
        """
        Elimina una conexión por su índice.
        
        Args:
            index (int): Índice de la conexión a eliminar.
        """
        if 0 <= index < len(self.connections):
            connection = self.connections.pop(index)
            # Nota: Aquí se debería implementar una lógica para cerrar la conexión de manera segura
            print(f"{Fore.YELLOW}Conexión {connection.host}:{connection.port} eliminada.{Style.RESET_ALL}")
        else:
            print(f"{Fore.RED}Índice de conexión inválido.{Style.RESET_ALL}")

    def list_connections(self):
        """Lista todas las conexiones activas."""
        for i, conn in enumerate(self.connections):
            print(f"{Fore.CYAN}{i}: {conn.host}:{conn.port} - {conn.mode} - {conn.meter_type}{Style.RESET_ALL}")

    def status(self):
        """Muestra el estado de todas las conexiones."""
        for i, conn in enumerate(self.connections):
            status = f"{Fore.GREEN}Conectado{Style.RESET_ALL}" if conn.connected else f"{Fore.RED}Desconectado{Style.RESET_ALL}"
            print(f"{Fore.CYAN}{i}: {conn.host}:{conn.port} - {status}{Style.RESET_ALL}")

    def run_connection(self, connection):
        """Ejecuta una conexión de medidor individual."""
        connection.connect()
        connection.handle_connection()