"""ImageGenerator — Protocol para backends de generacion de imagenes."""

from __future__ import annotations

from typing import TYPE_CHECKING, Protocol, runtime_checkable

if TYPE_CHECKING:
    from generation_config import GenerationConfig
    from image_gen_result import ImageGenResult


@runtime_checkable
class ImageGenerator(Protocol):
    """Interfaz comun para backends de generacion de imagenes con difusion.

    Cualquier clase que implemente `generate(config) -> ImageGenResult`
    satisface este Protocol sin herencia explicita (structural subtyping).

    Backends de ejemplo que satisfacen esta interfaz:
    - DiffusersGenerator: usa HuggingFace diffusers + torch.
    - SdCppGenerator: wrapper sobre stable-diffusion.cpp via ctypes/subprocess.
    - ComfyUIGenerator: cliente HTTP a ComfyUI API.
    - MockGenerator: implementacion de prueba sin GPU.

    El Protocol es `runtime_checkable`, por lo que se puede usar con isinstance():
        assert isinstance(my_backend, ImageGenerator)

    Nota: `isinstance()` con Protocol runtime_checkable solo verifica la presencia
    del metodo `generate`, no la firma completa. Para verificacion estricta usar mypy.
    """

    def generate(self, config: "GenerationConfig") -> "ImageGenResult":
        """Genera una imagen a partir de la configuracion de difusion.

        Args:
            config: Parametros de generacion. Ver GenerationConfig.

        Returns:
            Resultado con la imagen PIL, metadata de la generacion,
            duracion total y pico de VRAM. Ver ImageGenResult.

        Raises:
            Exception: El tipo concreto de error depende del backend.
                       Los backends deben documentar sus excepciones propias.
        """
        ...
