"""
火山引擎 MediaKit Service
=========================

通过 PlatformGateway 调用 MediaKit 第三方 API，自身负责：
- 参数校验
- 结果提取与格式化
"""

from __future__ import annotations

import logging
from dataclasses import dataclass, field
from typing import Any

from app.ai.adapters.constants import Method
from app.platform_gateway import PlatformGateway

logger = logging.getLogger(__name__)


@dataclass
class RemoveBackgroundResult:
    """抠图结果"""

    image_url: str = ""
    raw: dict[str, Any] = field(default_factory=dict)


class VolcengineMediakitService:
    """火山引擎 MediaKit 服务封装"""

    # 支持的场景
    SUPPORTED_SCENES = {"general", "human", "product"}

    def __init__(self, gateway: PlatformGateway):
        self.gateway = gateway

    async def remove_background(
        self,
        image_url: str,
        scene: str = "human",
    ) -> RemoveBackgroundResult:
        """同步抠图

        Args:
            image_url: 原始图片 URL
            scene: 场景类型，"general"（通用）、"human"（人物）或 "product"（商品）

        Returns:
            RemoveBackgroundResult: 包含抠图结果图片 URL

        Raises:
            ValueError: 参数校验失败
            PlatformError: 平台调用失败
        """
        if not image_url:
            raise ValueError("image_url 不能为空")

        if scene not in self.SUPPORTED_SCENES:
            raise ValueError(f"不支持的场景: {scene}，可选: {self.SUPPORTED_SCENES}")

        # 人物/商品场景默认启用白色描边 + 裁剪背景
        enable_contour = scene in ("human", "product")
        payload = {
            "image_url": image_url,
            "scene": scene,
            "need_contour": enable_contour,
            "contour_color": "#FFFFFF",
            "contour_size": 20,
            "need_crop_background": enable_contour,
        }

        response = await self.gateway.call_sync(
            platform="volcengine_mediakit",
            method=Method.REMOVE_BACKGROUND,
            payload=payload,
        )

        if not response.success:
            raise RuntimeError(
                response.error_message or "抠图失败"
            )

        result_image_url = (response.data or {}).get("image_url", "")
        return RemoveBackgroundResult(
            image_url=result_image_url,
            raw=response.data or {},
        )
