"""二维码相关接口 - API层"""
from fastapi import APIRouter, File, UploadFile

from app.schemas import ResultDomain
from app.services.workcase.qrcode import QrCodeService

router = APIRouter()

# 初始化服务
qrcode_service = QrCodeService()


@router.post(
    "/generate",
    response_model=ResultDomain[dict],
    summary="生成二维码",
    description="根据内容生成二维码"
)
async def generate_qrcode(
    content: str,
    size: int = 300,
    error_correction: str = "H"
) -> ResultDomain[dict]:
    """
    生成二维码

    - **content**: 二维码内容
    - **size**: 图片大小（像素，100-2000）
    - **error_correction**: 纠错级别
        - L: 7% 容错
        - M: 15% 容错
        - Q: 25% 容错
        - H: 30% 容错 (推荐)
    """
    result = await qrcode_service.generate_qrcode(
        content=content,
        size=size,
        error_correction=error_correction
    )

    if result["success"]:
        return ResultDomain.success(message="生成成功", data=result)
    else:
        return ResultDomain.fail(message=result.get("error", "生成失败"))


@router.post(
    "/parse",
    response_model=ResultDomain[dict],
    summary="解析二维码",
    description="解析二维码图片内容（支持URL、base64）"
)
async def parse_qrcode(
    image_source: str,
    strategy: str = "auto"
) -> ResultDomain[dict]:
    """
    解析二维码

    - **image_source**: 图片来源
        - URL: http://... 或 https://...
        - base64: data:image/...;base64,...
        - 本地路径: /path/to/image.png
    - **strategy**: 预处理策略
        - basic: 基础模式，仅尝试原图和灰度图
        - auto: 自动模式，尝试多种预处理方法 (推荐)
        - enhanced: 增强模式，使用更多预处理技术
        - all: 全部模式，尝试所有可能的预处理方法（包括多尺度）
    """
    result = await qrcode_service.parse_qrcode(
        image_source=image_source,
        strategy=strategy
    )

    if result["success"]:
        return ResultDomain.success(message="解析成功", data=result)
    else:
        return ResultDomain.fail(
            message=result.get("error", "解析失败"),
            data={"total_attempts": result.get("total_attempts", 0)}
        )


@router.post(
    "/parse-file",
    response_model=ResultDomain[dict],
    summary="解析二维码文件",
    description="通过文件上传解析二维码"
)
async def parse_qrcode_file(
    file: UploadFile = File(...),
    strategy: str = "auto"
) -> ResultDomain[dict]:
    """
    解析二维码文件上传

    - **file**: 二维码图片文件（支持 png/jpg/jpeg/bmp 等格式）
    - **strategy**: 预处理策略 (basic/auto/enhanced/all)
    """
    # 读取文件内容
    content = await file.read()

    # 提取文件类型
    if file.content_type:
        file_type = file.content_type.split("/")[-1]
    else:
        # 从文件名提取扩展名
        file_type = file.filename.split(".")[-1] if file.filename else "png"

    # 调用服务
    result = await qrcode_service.parse_qrcode_from_file(
        file_content=content,
        file_type=file_type,
        strategy=strategy
    )

    if result["success"]:
        return ResultDomain.success(message="解析成功", data=result)
    else:
        return ResultDomain.fail(
            message=result.get("error", "解析失败"),
            data={"total_attempts": result.get("total_attempts", 0)}
        )


@router.post(
    "/validate",
    response_model=ResultDomain[dict],
    summary="验证二维码内容",
    description="验证内容是否适合生成二维码"
)
async def validate_qrcode_content(
    content: str,
    max_length: int = 2953
) -> ResultDomain[dict]:
    """
    验证二维码内容

    - **content**: 要验证的内容
    - **max_length**: 最大长度（字节）
    """
    result = qrcode_service.validate_qrcode_content(content, max_length)

    if result["valid"]:
        return ResultDomain.success(
            message="内容有效",
            data={"length": result["length"]}
        )
    else:
        return ResultDomain.fail(message=result.get("error", "内容无效"))
