#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
通义万相文生图V2版API客户端模块

本模块提供可以直接被其他Python工程引入使用的方法，
功能与MCP方法的调用入参和逻辑完全一致。

作者: John Chen
"""

import os
from typing import List, Optional, Dict, Any
from .core import BailianImageCore


class BailianImageClient:
    """
    通义万相文生图V2版API客户端类

    提供可以直接被其他Python工程引入使用的方法，
    功能与MCP方法的调用入参和逻辑完全一致。
    """

    def __init__(self, api_key: Optional[str] = None):
        """
        初始化客户端

        Args:
            api_key: DashScope API密钥，如果不提供则从环境变量DASHSCOPE_API_KEY读取
        """
        self.core = BailianImageCore(api_key)

    def text2imagev2(
        self,
        prompt: str,
        negative_prompt: Optional[str] = None,
        model: str = "wanx-v1",
        size: str = "1024*1024",
        n: int = 1,
        seed: Optional[int] = None,
        ref_img: Optional[str] = None,
        ref_strength: Optional[float] = None,
        ref_mode: Optional[str] = None,
    ) -> Dict[str, Any]:
        """
        通义万相文生图V2版API调用

        支持文生图、支持正向和反向提示词、多种模型选择、自定义图像尺寸和生成数量。

        参考文档: https://help.aliyun.com/zh/model-studio/developer-reference/text-to-image-quick-start

        Args:
            prompt: 正向提示词，描述希望生成的图像内容
            negative_prompt: 反向提示词，描述不希望出现在图像中的内容（可选）
            model: 使用的模型，支持以下选项：
                - 'wanx-v1': 通用文生图模型
                - 'wanx-lite-v1': 轻量版文生图模型
                - 'wanx-sketch-v1': 素描风格模型
                - 'wanx-background-generation-v2': 背景生成模型
                默认为'wanx-v1'
            size: 生成图像的尺寸，支持以下选项：
                - '1024*1024': 正方形
                - '720*1280': 竖屏
                - '1280*720': 横屏
                - '768*1344': 竖屏高清
                - '1344*768': 横屏高清
                - '1536*1024': 横屏超清
                - '1024*1536': 竖屏超清
                默认为'1024*1024'
            n: 生成图像的数量，范围1-4，默认为1
            seed: 随机种子，用于生成可重现的结果（可选）
            ref_img: 参考图像URL，用于图像参考生成（可选）
            ref_strength: 参考强度，范围0.1-1.0，控制参考图像的影响程度（可选）
            ref_mode: 参考模式，目前支持'repaint'（可选）

        Returns:
            Dict[str, Any]: 包含生成结果的字典，包含以下字段：
                - success: bool，是否成功
                - images: List[str]，生成的图像URL列表（成功时）
                - error: str，错误信息（失败时）
                - request_id: str，请求ID

        Raises:
            ValueError: 当参数不合法时抛出异常

        Example:
            >>> client = BailianImageClient()
            >>> result = client.text2imagev2(
            ...     prompt="一只可爱的小猫咪",
            ...     negative_prompt="模糊，低质量",
            ...     model="wanx-v1",
            ...     size="1024*1024",
            ...     n=2
            ... )
            >>> if result['success']:
            ...     print(f"生成成功，图像URL: {result['images']}")
            ... else:
            ...     print(f"生成失败: {result['error']}")
        """
        return self.core.text2imagev2(
            prompt=prompt,
            negative_prompt=negative_prompt,
            model=model,
            size=size,
            n=n,
            seed=seed,
            ref_img=ref_img,
            ref_strength=ref_strength,
            ref_mode=ref_mode,
        )


# 便捷函数，可以直接导入使用
def text2imagev2(
    prompt: str,
    negative_prompt: Optional[str] = None,
    model: str = "wanx-v1",
    size: str = "1024*1024",
    n: int = 1,
    seed: Optional[int] = None,
    ref_img: Optional[str] = None,
    ref_strength: Optional[float] = None,
    ref_mode: Optional[str] = None,
    api_key: Optional[str] = None,
) -> Dict[str, Any]:
    """
    通义万相文生图V2版API便捷调用函数

    这是一个便捷函数，可以直接导入使用，无需创建客户端实例。
    功能与BailianImageClient.text2imagev2方法完全一致。

    Args:
        prompt: 正向提示词，描述希望生成的图像内容
        negative_prompt: 反向提示词，描述不希望出现在图像中的内容（可选）
        model: 使用的模型，默认为'wanx-v1'
        size: 生成图像的尺寸，默认为'1024*1024'
        n: 生成图像的数量，范围1-4，默认为1
        seed: 随机种子，用于生成可重现的结果（可选）
        ref_img: 参考图像URL，用于图像参考生成（可选）
        ref_strength: 参考强度，范围0.1-1.0（可选）
        ref_mode: 参考模式，可选值：'repaint'（可选）
        api_key: DashScope API密钥，如果不提供则从环境变量DASHSCOPE_API_KEY读取

    Returns:
        Dict[str, Any]: 包含生成结果的字典

    Example:
        >>> from mcp_server_bailian_image.client import text2imagev2
        >>> result = text2imagev2("一只可爱的小猫咪")
        >>> if result['success']:
        ...     print(f"生成成功，图像URL: {result['images']}")
    """
    client = BailianImageClient(api_key)
    return client.text2imagev2(
        prompt=prompt,
        negative_prompt=negative_prompt,
        model=model,
        size=size,
        n=n,
        seed=seed,
        ref_img=ref_img,
        ref_strength=ref_strength,
        ref_mode=ref_mode,
    )
