"""
Adapter wrapping FlowBrowserEngine as an ImageProvider.

FlowBrowserEngine is a headless Playwright engine with standalone functions.
This adapter provides the uniform ImageProvider interface while preserving
access to FlowBrowserEngine-specific features (reference images, media IDs).
"""

from __future__ import annotations

import logging
from pathlib import Path
from typing import Any

from providers.ports import ImageProvider

logger = logging.getLogger(__name__)


class GoogleFlowBrowserAdapter(ImageProvider):
    """ImageProvider adapter for FlowBrowserEngine.

    Unlike other image providers, FlowBrowserEngine is already async and
    uses a global singleton with browser lifecycle management.
    """

    name = "google_flow_browser"

    def __init__(self, aspect_ratio: str = "portrait") -> None:
        from providers.flow_browser_engine import ASPECT_RATIOS

        self._aspect_ratio_key = aspect_ratio
        self._aspect_ratio = ASPECT_RATIOS.get(
            aspect_ratio.lower(), "IMAGE_ASPECT_RATIO_PORTRAIT"
        )

    async def generate(self, prompt: str, output_path: Path, **kwargs: Any) -> Path:
        from providers.flow_browser_engine import generate_image

        aspect = kwargs.pop("aspect_ratio", self._aspect_ratio)
        reference_media_id = kwargs.pop("reference_media_id", None)
        reference_weight = kwargs.pop("reference_weight", 0.85)
        seed = kwargs.pop("seed", None)

        return await generate_image(
            prompt,
            output_path,
            aspect_ratio=aspect,
            seed=seed,
            reference_media_id=reference_media_id,
            reference_weight=reference_weight,
        )

    async def get_last_media_id(self) -> str | None:
        """Get the last generated media ID (for coverage shot references)."""
        from providers.flow_browser_engine import get_engine

        engine = await get_engine()
        return engine.last_media_id

    async def close(self) -> None:
        from providers.flow_browser_engine import stop_engine

        await stop_engine()
