"""diffusers_unload — libera memoria de un pipeline diffusers y limpia cache global."""

from __future__ import annotations

import gc
import sys
import os
from typing import Any


def diffusers_unload(pipe: Any | None = None) -> None:
    """Libera la memoria ocupada por un pipeline diffusers.

    Si se pasa pipe, lo elimina con del y llama gc.collect() + empty_cache().
    Si pipe es None, limpia ademas el cache global de diffusers_load_pipeline
    (descarga TODOS los pipelines cacheados). En ambos casos invoca
    torch.cuda.empty_cache() si CUDA esta disponible.

    Args:
        pipe:  Pipeline a liberar. Si None, limpia el cache global completo
               de diffusers_load_pipeline ademas de llamar gc + empty_cache.

    Returns:
        None. Efecto secundario: memoria GPU/CPU liberada.
    """
    if pipe is None:
        # Limpiar cache global de diffusers_load_pipeline si esta importado
        try:
            # Importar el modulo para acceder a su cache interno
            load_module_path = os.path.join(os.path.dirname(__file__))
            if load_module_path not in sys.path:
                sys.path.insert(0, load_module_path)
            from diffusers_load_pipeline import _clear_pipeline_cache
            _clear_pipeline_cache()
        except ImportError:
            pass
    else:
        del pipe

    gc.collect()

    try:
        import torch
        if torch.cuda.is_available():
            torch.cuda.empty_cache()
    except ImportError:
        pass
