"""diffusers_load_lora — carga un adaptador LoRA en un pipeline diffusers."""

from __future__ import annotations

import sys
import os
from typing import Any

sys.path.insert(0, os.path.dirname(__file__))

from lora_ref import LoraRef


def diffusers_load_lora(pipe: Any, lora: LoraRef) -> Any:
    """Carga un adaptador LoRA en un pipeline diffusers y ajusta su peso de fusion.

    Usa pipe.load_lora_weights(lora.path) para cargar los pesos del adaptador.
    Si lora.weight != 1.0, aplica set_adapters(['default'], adapter_weights=[w])
    para escalar la contribucion del LoRA. Modifica el pipe in-place y retorna
    el mismo objeto para composicion.

    Args:
        pipe:  Pipeline diffusers cargado. Debe soportar load_lora_weights
               (StableDiffusionPipeline, StableDiffusionXLPipeline, etc.).
        lora:  Referencia al adaptador LoRA. lora.path apunta al archivo
               .safetensors o directorio del adaptador. lora.weight controla
               la intensidad de fusion (1.0 = peso completo, 0.0 = sin efecto).

    Returns:
        El mismo pipe con el LoRA cargado y el peso de fusion aplicado.

    Raises:
        ImportError: Si diffusers no esta instalado.
        OSError:     Si lora.path no existe o el formato del archivo es invalido.
    """
    try:
        import diffusers  # noqa: F401 — verificar disponibilidad
    except ImportError as exc:
        raise ImportError(
            "diffusers_load_lora requiere diffusers. "
            "Instalar con: pip install diffusers"
        ) from exc

    pipe.load_lora_weights(lora.path)

    if lora.weight != 1.0:
        # set_adapters acepta lista de nombres y lista de pesos.
        # El nombre "default" es el que diffusers asigna al primer LoRA cargado.
        if hasattr(pipe, "set_adapters"):
            pipe.set_adapters(["default"], adapter_weights=[lora.weight])
        elif hasattr(pipe, "fuse_lora"):
            # Fallback para versiones antiguas de diffusers
            pipe.fuse_lora(lora_scale=lora.weight)

    return pipe
