"""Mock Flora adapter for testing — returns canned responses."""

from __future__ import annotations

import uuid
from typing import Optional

from recoil.execution.providers.base import (
    CAPABILITY_KEYS,
    PollRequest,
    PollResult,
    ProviderJob,
    SubmitRequest,
    UnifiedVideoPayload,
)


class MockFloraAdapter:
    provider_id = "flora"
    supported_models = [
        "seeddance-2.0", "seeddance-2.0-fast", "seeddance-1.5-pro",
        "kling-2.5-pro", "kling-3.0-pro", "gpt-image-2",
    ]
    auth_env_var = "FLORA_API_KEY"
    base_url = "https://mock.flora.test/api/v1"
    max_prompt_chars = 2500
    capabilities = {k: False for k in CAPABILITY_KEYS}
    capabilities.update({"t2v": True, "i2v": True, "r2v": True, "end_frame": True, "audio": True, "negative_prompt": True, "resolution_720p": True})
    status = "primary"

    def build_submit(self, payload: UnifiedVideoPayload, tier: str) -> SubmitRequest:
        return SubmitRequest(method="POST", url=f"{self.base_url}/generate", headers={}, body={"prompt": payload.prompt})

    def parse_submit(self, resp: dict, payload: UnifiedVideoPayload, tier: str) -> ProviderJob:
        return ProviderJob(
            provider_id=self.provider_id, model_id=payload.model_id,
            native_id=f"run_mock_{uuid.uuid4().hex[:8]}", tier=tier,
            duration_s=payload.duration_s, resolution=payload.resolution,
            native_state={"poll_url": f"{self.base_url}/runs/mock", "charged_cost": 1.06},
        )

    def build_poll(self, job: ProviderJob) -> PollRequest:
        return PollRequest(method="GET", url=job.native_state["poll_url"], headers={})

    def parse_poll(self, resp: dict, job: ProviderJob) -> PollResult:
        return PollResult(
            status="COMPLETED", video_url="https://mock.flora.test/video.mp4",
            audio_url=None, observed_cost=1.06, error=None, raw=resp,
        )

    def build_result_fetch(self, job: ProviderJob) -> Optional[PollRequest]:
        return None

    def parse_result(self, resp: dict, job: ProviderJob) -> PollResult:
        return self.parse_poll(resp, job)

    def compute_cost(self, duration_s: float, tier: str, profile: dict) -> float:
        return 1.06


ADAPTER = MockFloraAdapter()
