"""
Patch para corregir la ruta del DLL de WinFSP antes de que se importe el módulo FUSE.
Este archivo debe importarse antes que cualquier otro que use FUSE.
"""

import os
import sys
import ctypes

def apply_fuse_patch():
    """
    Aplica un parche para corregir la ruta del DLL de WinFSP que usa FUSE.
    Esto soluciona el problema donde fusepy busca la DLL en WinFspbin en lugar de WinFsp\bin.
    """
    # Rutas alternativas para el DLL de WinFSP
    possible_paths = [
        os.path.join(os.environ.get('ProgramFiles(x86)', 'C:\\Program Files (x86)'), "WinFsp", "bin", "winfsp-x64.dll"),
        os.path.join(os.environ.get('ProgramFiles', 'C:\\Program Files'), "WinFsp", "bin", "winfsp-x64.dll"),
        "C:\\WinFsp\\bin\\winfsp-x64.dll"
    ]
    
    correct_dll_path = None
    for path in possible_paths:
        if os.path.exists(path):
            correct_dll_path = path
            break

    if correct_dll_path:
        print(f"INFO: DLL de WinFSP encontrado en: {correct_dll_path}")
        
        # Modificar la variable de entorno para que FUSE la use
        os.environ["WINFSPDLL"] = correct_dll_path
        
        # Parchear directamente el módulo FUSE
        original_import = __import__
        
        def patched_import(name, *args, **kwargs):
            module = original_import(name, *args, **kwargs)
            if name == 'fuse':
                # Sobrescribir el path directamente en el módulo FUSE
                if hasattr(module, '_libfuse_path'):
                    module._libfuse_path = correct_dll_path
                    print(f"INFO: Ruta de DLL en módulo FUSE corregida a: {correct_dll_path}")
                else:
                    print("ADVERTENCIA: El módulo FUSE no tiene el atributo '_libfuse_path'.")
            return module
        
        # Reemplazar la función de importación
        __builtins__["__import__"] = patched_import
        
        # Preemptively set `_libfuse_path` in the `fuse` module namespace
        sys.modules['fuse'] = type('fuse', (), {'_libfuse_path': correct_dll_path})
        print(f"INFO: _libfuse_path preconfigurado en el espacio de nombres del módulo FUSE.")
        
        # Intentar cargar el DLL directamente para verificar
        try:
            ctypes.CDLL(correct_dll_path)
            print("INFO: DLL de WinFSP cargado correctamente.")
        except Exception as e:
            print(f"ERROR: No se pudo cargar el DLL de WinFSP: {e}")
            print("SUGERENCIA: Verifique que todas las dependencias del DLL estén instaladas.")
        
        return True
    else:
        print("ADVERTENCIA: No se encontró el DLL de WinFSP en ninguna de las rutas probadas.")
        print("Rutas probadas:")
        for path in possible_paths:
            print(f"  - {path}")
        return False

# Aplicar el parche inmediatamente
success = apply_fuse_patch()
if not success:
    print("ADVERTENCIA: No se pudo aplicar el parche de FUSE. El sistema funcionará en modo de copia física.")
