from datetime import datetime
import pymongo
# from flask import jsonify

#Configuración Global
MONGO_URI = "mongodb://localhost:27017/"
DB_NAME = "users"
COLLECTION_NAME = "ciclos"
SERVICIOS = ["enviro", "nanoox", "scapp", "pss", "flux"] # Lista centralizada de servicios

# Conexión
client = pymongo.MongoClient(MONGO_URI)
user_db = client[DB_NAME]
ciclos_collection = user_db[COLLECTION_NAME]

def verificacion_status_servicios_por_centro():
    # Proyección dinámica basada en la lista de servicios
    projection_fields = {serv: 1 for serv in SERVICIOS}
    projection_fields["centro_id"] = 1 # Agregamos el ID del centro

    print("Iniciando validación de servicios...")
    
    try:
        # Modo Normal: Calcula fechas y actualiza
        procesar_centros(projection_fields, modo_recuperacion=False)
        print("Actualización Realizada con éxito")
        
    except Exception as e:
        print(f"Error detectado ({e}). Iniciando modo recuperación...")
        # Modo Recuperación: Setea None si algo falló masivamente
        procesar_centros(projection_fields, modo_recuperacion=True)
        print("Recuperación/Creación Realizada con éxito")

def procesar_centros(projection, modo_recuperacion=False):
    """
    Itera sobre los centros y sus servicios.
    Si modo_recuperacion es False, calcula el status por fecha.
    Si modo_recuperacion es True, fuerza el status a None.
    """
    cursor = ciclos_collection.find({}, projection=projection)
    
    for doc in cursor:
        centro_id = doc.get("centro_id")
        
        for servicio in SERVICIOS:
            # .get() maneja el caso Legacy: si "flux" no existe, data_servicio es None
            data_servicio = doc.get(servicio)
            
            if data_servicio:
                if not modo_recuperacion:
                    # Lógica normal: validar fechas
                    nuevo_status = verificar_rango_fechas(data_servicio.get("init"), data_servicio.get("fin"))
                else:
                    # Lógica error: setear a None
                    nuevo_status = None
                
                # Llamada a la función genérica
                actualizar_status_generico(centro_id, servicio, data_servicio.get("status"), nuevo_status)

def actualizar_status_generico(centro_id, nombre_servicio, status_actual, status_nuevo):
    """
    Función única para actualizar cualquier servicio.
    Construye la query dinámicamente usando el nombre_servicio.
    """
    if status_actual != status_nuevo:
        filtro = {"centro_id": centro_id}
        # Construcción dinámica de la llave, ej: "flux.status"
        campo_a_actualizar = f"{nombre_servicio}.status" 
        
        update_query = {"$set": {campo_a_actualizar: status_nuevo}}
        
        # Ejecutamos la actualización
        ciclos_collection.update_one(filtro, update_query, upsert=True)
        print(f"Status '{nombre_servicio}' actualizado a {status_nuevo} en centro {centro_id}")
    else:
        # Opcional: comentar esto para reducir ruido en logs
        # print(f"Sin variaciones en '{nombre_servicio}' para centro {centro_id}")
        pass

def verificar_rango_fechas(fecha_inicio_str, fecha_fin_str):
    if not fecha_inicio_str or not fecha_fin_str:
        return False
    
    try:
        fecha_inicio = datetime.strptime(fecha_inicio_str, "%Y-%m-%d")
        fecha_fin = datetime.strptime(fecha_fin_str, "%Y-%m-%d")
        fecha_actual = datetime.now()
        
        return fecha_inicio <= fecha_actual <= fecha_fin
    except ValueError:
        return False