#!/usr/bin/env python3
"""
Script para monitorear y actualizar los estados de los medidores
basado en la última medición recibida.

Este script:
1. Consulta la última medición de cada medidor
2. Actualiza el estado en la tabla tiempo_real:
   - Estado 2 (Normal): si hubo medición en las últimas X horas
   - Estado 4 (Falta Reporte): si hace más de X horas sin medición

El tiempo X es configurable desde el archivo .env (TIEMPO_SIN_REPORTE_HORAS)
"""

import os
import sys
import logging
from datetime import datetime
from dotenv import load_dotenv

# Añadir el directorio actual al path para imports
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

from models.estado_monitor import EstadoMonitor

def configurar_logging():
    """Configura el sistema de logging"""
    # Cargar variables de entorno
    load_dotenv()
    
    log_level = os.getenv('LOG_LEVEL', 'INFO').upper()
    
    # Configurar formato de logging
    logging.basicConfig(
        level=getattr(logging, log_level),
        format='%(asctime)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

def main():
    """Función principal del script"""
    configurar_logging()
    
    logging.info("=" * 60)
    logging.info("INICIANDO MONITOR DE ESTADOS DE MEDIDORES")
    logging.info("=" * 60)
    
    try:
        # Crear instancia del monitor
        monitor = EstadoMonitor()
        
        # Mostrar configuración actual
        logging.info(f"Configuración:")
        logging.info(f"- Tiempo sin reporte: {monitor.tiempo_sin_reporte_horas} horas")
        logging.info(f"- Estado Normal: {monitor.ESTADO_NORMAL}")
        logging.info(f"- Estado Falta Reporte: {monitor.ESTADO_FALTA_REPORTE}")
        
        # Obtener resumen actual antes de la actualización
        logging.info("\nResumen de estados ANTES de la actualización:")
        resumen_antes = monitor.obtener_resumen_estados()
        if resumen_antes:
            for estado, cantidad in resumen_antes.items():
                logging.info(f"- {estado}: {cantidad} medidores")
        else:
            logging.info("- No se pudo obtener el resumen")
        
        # Ejecutar actualización de estados
        logging.info("\n" + "-" * 50)
        resultado = monitor.actualizar_estados_medidores()
        logging.info("-" * 50)
        
        if resultado['success']:
            logging.info("\n✅ ACTUALIZACIÓN COMPLETADA EXITOSAMENTE")
            logging.info(f"📊 Estadísticas de la ejecución:")
            logging.info(f"   - Medidores procesados: {resultado['medidores_procesados']}")
            logging.info(f"   - Medidores normales: {resultado['medidores_normales']}")
            logging.info(f"   - Medidores sin reporte: {resultado['medidores_sin_reporte']}")
            
            # Obtener resumen actual después de la actualización
            logging.info("\nResumen de estados DESPUÉS de la actualización:")
            resumen_despues = monitor.obtener_resumen_estados()
            if resumen_despues:
                for estado, cantidad in resumen_despues.items():
                    logging.info(f"- {estado}: {cantidad} medidores")
            
        else:
            logging.error("\n❌ ERROR EN LA ACTUALIZACIÓN")
            logging.error(f"Error: {resultado.get('error', 'Error desconocido')}")
            return 1
            
    except KeyboardInterrupt:
        logging.info("\n⚠️  Proceso interrumpido por el usuario")
        return 1
        
    except Exception as e:
        logging.error(f"\n💥 ERROR INESPERADO: {e}")
        logging.exception("Detalles del error:")
        return 1
    
    finally:
        logging.info("\n" + "=" * 60)
        logging.info("FINALIZANDO MONITOR DE ESTADOS DE MEDIDORES")
        logging.info("=" * 60)
    
    return 0

if __name__ == "__main__":
    exit_code = main()
    sys.exit(exit_code) 