from pymongo.collection import Collection
from typing import Dict, Any


# from scapp_modules.Logger import main_logger

def main_logger(text):
    print(text)


def update_scapp_db_version(parameters_collection: Collection, version: Any) -> None:
    """ # ? Actualiza o inserta el documento con _id 'ScappDBVersion' en la colección proporcionada,
        # ? estableciendo el campo 'version' con el valor recibido.

    Args:
        parameters_collection (Collection): Instancia de la colección de MongoDB.
        version (Any): Valor a establecer en el campo 'version'.
    """
    try:
        parameters_collection.update_one(
            {"_id": "ScappDBVersion"},
            {"$set": {"version": version}},
            upsert=True
        )
    except Exception as e:
        # Manejo de errores: aquí podrías implementar un registro (logging) o gestionar la excepción de otra forma.
        raise Exception(f"Error al actualizar el documento 'ScappDBVersion': {e}")
    
    

def get_scapp_db_version(parameters_collection: Collection) -> Dict[str, Any]:
    """ # ? Busca y retorna el documento con _id 'ScappDBVersion' en la colección proporcionada.
        # ? Si el documento no existe, retorna un diccionario vacío.

    Args:
        parameters_collection (Collection): Instancia de la colección de MongoDB.

    Returns:
        Dict[str, Any]: El documento encontrado o un diccionario vacío si no se encuentra.
    """
    try:
        document = parameters_collection.find_one({"_id": "ScappDBVersion"})
        return document if document is not None else {}
    except Exception as e:
        raise Exception(f"Error al buscar el documento 'ScappDBVersion': {e}")

        


def refactorice_indices_cameras( cameras_collection: Collection ) -> None:
    """ # ? Migra documentos de la estructura antigua a la nueva utilizando _id como identificador.
    
    Migraciones a realizar:
      - { "Cameras": "AllCameras" }                 => {_id: "Cameras", ... }
      - { "Historical_Index": "Cameras_Index" }     => {_id: "HistoricalIndices", ... }
      - { "RespaldoCameras": "AllCameras" }         => {_id: "RespaldoCameras", ... }
      
    """
    # Configuración de las migraciones: cada diccionario define el campo antiguo, su valor
    # y el nuevo valor que se usará en el _id.
    migraciones = [
        {
            "old_field": "Cameras",
            "old_value": "AllCameras",
            "new_id": "Cameras"
        },
        {
            "old_field": "Historical_Index",
            "old_value": "Cameras_Index",
            "new_id": "HistoricalIndices"
        },
        {
            "old_field": "RespaldoCameras",
            "old_value": "AllCameras",
            "new_id": "RespaldoCameras"
        }
    ]
    
    # Contador de documentos migrados
    # migrated = 0
    
    for mig in migraciones:
        old_field = mig["old_field"]
        old_value = mig["old_value"]
        new_id    = mig["new_id"]
        
        # Buscamos el documento con la estructura antigua
        query = { old_field: old_value }
        doc = cameras_collection.find_one(query)
        
        if doc:
            main_logger(f"Documento encontrado con {old_field}: {old_value}. Migrando a _id: {new_id}")
            
            # Se crea una copia del documento para modificarlo
            nuevo_doc = doc.copy()
            # Se remueve el campo _id antiguo (generado automáticamente)
            nuevo_doc.pop('_id', None)
            # Se elimina el campo que ya no se usará (el de la estructura antigua)
            nuevo_doc.pop(old_field, None)
            # Se establece el nuevo _id
            nuevo_doc['_id'] = new_id
            
            try:
                # Insertamos el nuevo documento con la nueva estructura
                cameras_collection.insert_one(nuevo_doc)
                # Borramos el documento antiguo
                cameras_collection.delete_one(query)
                
                # Aumentar contador de documentos migrados
                # migrated += 1
                
                main_logger(f"Documento migrado exitosamente a _id: {new_id}")
                
            except Exception as e:
                main_logger(f"Error al migrar el documento con {old_field}: {e}")
        # else:
        #     main_logger(f"No se encontró documento con {old_field}: {old_value}")
    return



# Refactorizar indices
# refactorice_indices_cameras()


