# src/cli/commands.py
"""
Módulo de comandos CLI - MVP v1.0

Implementa la interfaz de línea de comandos del sistema:
- Procesamiento de comandos de usuario
- Visualización de estado
- Control del sistema
"""

import logging
from datetime import datetime

logger = logging.getLogger(__name__)

class CommandProcessor:
    """
    Procesador de comandos de usuario.
    """
    
    def __init__(self, realtime_processor):
        self.processor = realtime_processor
        self.commands = {
            'X': self._exit_system,
            'V': self._toggle_verbose,
            'D': self._toggle_debug,  # Añadido comando D
            'S': self._show_status,
            'M': self._show_measurements
        }

    def start(self):
        """
        Inicia el procesador de comandos.
        """
        while self.processor.running:
            try:
                self._show_menu()
                cmd = input("\nComando: ").strip().upper()
                self._process_command(cmd)
            except EOFError:
                break
            except Exception as e:
                logger.error(f"Error procesando comando: {e}")


    def _show_menu(self):
        """
        Muestra el menú de comandos disponibles.
        """
        print("\n=== Sistema de Monitoreo ===")
        estados = []
        if self.processor.verbose:
            estados.append("VERBOSE")
        else:
            estados.append("NORMAL")
        if self.processor.debug:
            estados.append("DEBUG")
            
        print(f"Estado: {' | '.join(estados)}")
        print(f"Entradas activas: {len(self.processor.entradas)}")
        print("\nComandos disponibles:")
        print("  X - Salir")
        print("  V - Toggle modo Verbose")
        print("  D - Toggle modo Debug")  # Añadida opción D al menú
        print("  S - Mostrar estado")
        print("  M - Mostrar mediciones")

    def _process_command(self, cmd):
        """
        Procesa un comando de usuario.
        """
        if cmd in self.commands:
            self.commands[cmd]()
        else:
            print("Comando no reconocido")

    def _exit_system(self):
        """
        Detiene el sistema.
        """
        self.processor.stop()
        print("Deteniendo sistema...")

    def _toggle_verbose(self):
        """
        Cambia el modo verbose.
        """
        self.processor.toggle_verbose()
        
    def _toggle_debug(self):
        """
        Cambia el modo debug.
        """
        self.processor.toggle_debug()

    def _show_status(self):
        """
        Muestra el estado actual del sistema.
        """
        print("\n=== Estado del Sistema ===")
        print(f"Último proceso: {self.processor.last_process_time}")
        print(f"Entradas activas: {len(self.processor.entradas)}")
        print("\nEstadísticas por entrada:")
        
        for dmac, entrada in self.processor.entradas.items():
            stats = entrada.get_estadisticas()
            if stats:
                print(f"\nEntrada {dmac}:")
                print(f"  Período: {stats['periodo_inicio']} - {stats['periodo_fin']}")
                print(f"  Mediciones: {self.processor.period_measurements.get(dmac, 0)}")
                if stats['promedio'] is not None:
                    print(f"  Promedio: {stats['promedio']}°C")

    def _show_measurements(self):
        """
        Muestra las mediciones actuales.
        """
        print("\n=== Mediciones Actuales ===")
        total = sum(self.processor.period_measurements.values())
        print(f"Total mediciones período: {total}")
        
        for dmac, entrada in self.processor.entradas.items():
            count = self.processor.period_measurements.get(dmac, 0)
            if count > 0:
                stats = entrada.get_estadisticas()
                if stats and stats['promedio'] is not None:
                    print(f"\nEntrada {dmac}:")
                    print(f"  Mediciones: {count}")
                    print(f"  Última temperatura: {stats['promedio']}°C")
                    print(f"  Máx/Min: {stats['maximo']}°C / {stats['minimo']}°C")
                    
