import sys
import os
import subprocess
from module_utils import find_module_path, prepare_mountpoint, validate_dependencies, unmount_filesystem
from quantum_fs import DedupFS

# Asegurar que las rutas relevantes estén en sys.path
repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
# Prefer a local .venv site-packages if present, otherwise fall back to 'veny' or 'venv'
candidates = ['.venv', 'veny', 'venv']
venv_site_packages = None
for c in candidates:
    candidate_path = os.path.join(repo_root, c, 'Lib', 'site-packages')
    if os.path.isdir(candidate_path):
        venv_site_packages = os.path.abspath(candidate_path)
        break
# If found, insert at front
if venv_site_packages and venv_site_packages not in sys.path:
    sys.path.insert(0, venv_site_packages)

# Ajustar rutas dinámicamente para módulos específicos, buscando dentro del site-packages
if venv_site_packages:
    for module in ["fusepy", "zstd", "numpy", "Pillow", "anytree"]:
        module_path = find_module_path(module, venv_site_packages)
        if module_path and module_path not in sys.path:
            sys.path.insert(0, module_path)

def unmount(mountpoint):
    """Desmonta el sistema de archivos si está ocupado."""
    try:
        unmount_filesystem(mountpoint)  # Usar unmount_filesystem
        print(f"DEBUG: Punto de montaje {mountpoint} desmontado correctamente.")
    except Exception as e:
        print(f"ERROR: No se pudo desmontar el punto de montaje {mountpoint}: {e}")

def main():
    if len(sys.argv) < 2:
        print("Uso: python quantum_driver.py <punto_de_montaje> [--clear-mountpoint]")
        sys.exit(1)

    mountpoint = os.path.abspath(sys.argv[1])

    # Validar dependencias
    if not validate_dependencies():
        print("ERROR: Faltan dependencias necesarias. Instálelas antes de continuar.")
        sys.exit(1)

    # Preparar el punto de montaje
    if not prepare_mountpoint(mountpoint):
        print(f"ERROR: No se pudo preparar el punto de montaje: {mountpoint}")
        sys.exit(1)

    fs = DedupFS(mountpoint)

    # Comando para vaciar el mount point
    if len(sys.argv) > 2 and sys.argv[2] == "--clear-mountpoint":
        fs.clear_mountpoint()
        sys.exit(0)

    print(f"Iniciando el Quantum Driver en el punto de montaje: {mountpoint}")
    try:
        fs.mount()
        # Determine whether the filesystem was mounted via FUSE or populated in physical copy mode
        if getattr(fs, 'fuse_mounted', False):
            print("Sistema montado con FUSE.")
        else:
            print("Sistema disponible (modo copia física). Archivos escritos en el punto de montaje.")
    except RuntimeError as e:
        if "mount point in use" in str(e):
            print("ERROR: El punto de montaje ya está en uso. Intentando desmontarlo...")
            unmount(mountpoint)
            print("Reintentando montar el sistema de archivos...")
            fs.mount()
        else:
            print(f"ERROR: No se pudo montar el sistema de archivos con FUSE: {e}")
            print("Cambiando a modo de copia física...")
            prepare_mountpoint(mountpoint)  # Asegurar que el directorio físico esté listo
            print(f"Archivos disponibles en: {mountpoint}")
    except Exception as e:
        print(f"ERROR: Error inesperado al iniciar el Quantum Driver: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
