from datetime import datetime
import pymongo
#from flask import jsonify

#------ Establecer conexin con la BD ----- *
# Conecta a la instancia de MongoDB
client = pymongo.MongoClient("mongodb://localhost:27017/")

# Bases de datos globales, compartidas entre clientes. Cada cliente es una coleccion
user_database_name = "users"
user_db = client[user_database_name]
#Acceso a colección ciclos
ciclos_collection = user_db.ciclos

def verificacion_status_servicios_por_centro():
    try:
        for i in ciclos_collection.find({},projection ={ "centro_id": 1, "enviro": 1,  "nanoox": 1,  "scapp": 1,  "pss": 1}):
            enviro_actualizar_status(i["centro_id"] ,i["enviro"]["status"], verificar_rango_fechas(i["enviro"]["init"], i["enviro"]["fin"]))
            nanoox_actualizar_status(i["centro_id"] ,i["nanoox"]["status"], verificar_rango_fechas(i["nanoox"]["init"], i["nanoox"]["fin"]))
            scapp_actualizar_status(i["centro_id"] ,i["scapp"]["status"], verificar_rango_fechas(i["scapp"]["init"], i["scapp"]["fin"]))
            pss_actualizar_status(i["centro_id"] ,i["pss"]["status"], verificar_rango_fechas(i["pss"]["init"], i["pss"]["fin"]))
        print ("Actualización Realizada con éxito")
        #return jsonify({"mensaje": f" Actualización de Status realizada con éxito! "}), 200
        #return 201
    except:
        for i in ciclos_collection.find({},projection ={ "centro_id": 1, "enviro": 1,  "nanoox": 1,  "scapp": 1,  "pss": 1}):
            enviro_actualizar_status(i["centro_id"] ,None, verificar_rango_fechas(i["enviro"]["init"], i["enviro"]["fin"]))
            nanoox_actualizar_status(i["centro_id"] ,None, verificar_rango_fechas(i["nanoox"]["init"], i["nanoox"]["fin"]))
            scapp_actualizar_status(i["centro_id"] ,None, verificar_rango_fechas(i["scapp"]["init"], i["scapp"]["fin"]))
            pss_actualizar_status(i["centro_id"] ,None, verificar_rango_fechas(i["pss"]["init"], i["pss"]["fin"]))
        print ("Creación Realizada con éxito")
        #return jsonify({"mensaje": f" Actualización de Status realizada con éxito! "}), 200

def verificar_rango_fechas(fecha_inicio_str, fecha_fin_str):
    if (fecha_inicio_str == None or fecha_fin_str == None):
        return False
    else:
        # Convertir las fechas de string a objetos datetime
        fecha_inicio = datetime.strptime(fecha_inicio_str, "%Y-%m-%d")
        fecha_fin = datetime.strptime(fecha_fin_str, "%Y-%m-%d")
    
        # Obtener la fecha actual
        fecha_actual = datetime.now()
    
        # Verificar si la fecha actual está dentro del rango
        esta_dentro = fecha_inicio <= fecha_actual <= fecha_fin
    
        return esta_dentro

def enviro_actualizar_status(centro ,bool_1, bool_2):
    bulk_operations = []
    if bool_1 != bool_2:
        # Definir el filtro para encontrar el documento que deseas actualizar
        filtro = {"centro_id": centro}  # Por ejemplo, aquí asumimos que el documento tiene el _id 1

        # Definir el nuevo valor para el campo anidado que quieres actualizar
        nuevo_valor = {"enviro.status": bool_2}

        # Realizar la actualización en la base de datos
        operacion = pymongo.UpdateOne(filtro, {"$set": nuevo_valor}, upsert=True)
        bulk_operations.append(operacion)
        print(f'Status Enviro actualizado exitosamente en centro {centro}')
    else:
        print(f'No ha variado el status Enviro del centro {centro}')
    if bulk_operations:
        ciclos_collection.bulk_write(bulk_operations)
        print("Enviro status actualizado correctamente!")

def nanoox_actualizar_status(centro ,bool_1, bool_2):
    bulk_operations = []
    if bool_1 != bool_2:
        # Definir el filtro para encontrar el documento que deseas actualizar
        filtro = {"centro_id": centro}  # Por ejemplo, aquí asumimos que el documento tiene el _id 1

        # Definir el nuevo valor para el campo anidado que quieres actualizar
        nuevo_valor = {"nanoox.status": bool_2}

        # Realizar la actualización en la base de datos
        operacion = pymongo.UpdateOne(filtro, {"$set": nuevo_valor}, upsert=True)
        bulk_operations.append(operacion)
        print(f'Status Nanoox actualizado exitosamente en centro {centro}')
    else:
        print(f'No ha variado el status Nanoox del centro {centro}')
    if bulk_operations:
        ciclos_collection.bulk_write(bulk_operations)
        print("Nanoox status actualizado correctamente!")

def scapp_actualizar_status(centro ,bool_1, bool_2):
    bulk_operations = []
    if bool_1 != bool_2:
        # Definir el filtro para encontrar el documento que deseas actualizar
        filtro = {"centro_id": centro}  # Por ejemplo, aquí asumimos que el documento tiene el _id 1

        # Definir el nuevo valor para el campo anidado que quieres actualizar
        nuevo_valor = {"scapp.status": bool_2}

        # Realizar la actualización en la base de datos
        operacion = pymongo.UpdateOne(filtro, {"$set": nuevo_valor}, upsert=True)
        bulk_operations.append(operacion)
        print(f'Status Scapp actualizado exitosamente en centro {centro}')
    else:
        print(f'No ha variado el status Scapp del centro {centro}')
    if bulk_operations:
        ciclos_collection.bulk_write(bulk_operations)
        print("Scapp status actualizado correctamente!")

def pss_actualizar_status(centro ,bool_1, bool_2):
    bulk_operations = []
    if bool_1 != bool_2:
        # Definir el filtro para encontrar el documento que deseas actualizar
        filtro = {"centro_id": centro}  # Por ejemplo, aquí asumimos que el documento tiene el _id 1

        # Definir el nuevo valor para el campo anidado que quieres actualizar
        nuevo_valor = {"pss.status": bool_2}

        # Realizar la actualización en la base de datos
        operacion = pymongo.UpdateOne(filtro, {"$set": nuevo_valor}, upsert=True)
        bulk_operations.append(operacion)
        print(f'Status Pss actualizado exitosamente en centro {centro}')
    else:
        print(f'No ha variado el status Pss del centro {centro}')
    if bulk_operations:
        ciclos_collection.bulk_write(bulk_operations)
        print("Pss status actualizado correctamente!")

verificacion_status_servicios_por_centro()