"""Deterministic mock piapi adapter (inline result; observed cost populated)."""

from __future__ import annotations
from typing import Optional

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


class MockPiApiAdapter:
    provider_id = "piapi"
    supported_models = ["seeddance-2.0"]
    auth_env_var = "PIAPI_API_KEY"
    base_url = "mock://piapi"
    max_prompt_chars = None
    status = "testing"
    capabilities = {
        "t2v": True, "i2v": True, "r2v": True,
        "end_frame": False,         # critical for capability test
        "audio": True, "negative_prompt": True,
        "resolution_480p": False, "resolution_720p": True, "resolution_1080p": True,
    }

    def build_submit(self, payload, tier):
        return SubmitRequest(
            method="POST", url=f"{self.base_url}/task", headers={"X-API-Key": "mock"},
            body={"model": "seedance", "task_type": tier, "input": {"prompt": payload.prompt}},
        )

    def parse_submit(self, resp, payload, tier):
        data = resp.get("data", resp)
        return ProviderJob(
            provider_id=self.provider_id, model_id=payload.model_id,
            native_id=data.get("task_id", "mock-piapi-task"),
            tier=tier, duration_s=payload.duration_s, resolution=payload.resolution,
            native_state={},
        )

    def build_poll(self, job):
        return PollRequest(method="POST", url=f"{self.base_url}/task/{job.native_id}", headers={})

    def parse_poll(self, resp, job):
        data = resp.get("data", resp)
        raw = (data.get("status") or "").lower()
        if raw == "completed":
            return self.parse_result(resp, job)
        if raw == "failed":
            return PollResult(status="FAILED", error="mock piapi failed", raw=data)
        return PollResult(status="IN_PROGRESS", raw=data)

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

    def parse_result(self, resp, job):
        data = resp.get("data", resp) if isinstance(resp, dict) and "data" in resp else resp
        output = (data or {}).get("output") or {}
        video_url = None
        if isinstance(output.get("video"), dict):
            video_url = output["video"].get("url")
        meta = (data or {}).get("meta") or {}
        consume = (meta.get("usage") or {}).get("consume")
        observed = float(consume) * 0.01 if isinstance(consume, (int, float)) else None
        return PollResult(status="COMPLETED", video_url=video_url, observed_cost=observed, raw=data or {})

    def compute_cost(self, duration_s, tier, profile):
        return 0.13 * float(duration_s)


ADAPTER = MockPiApiAdapter()
__all__ = ["MockPiApiAdapter", "ADAPTER"]
