"""
语音识别 API
"""
from fastapi import APIRouter, Depends, File, HTTPException, Query, UploadFile
from fastapi.responses import Response
from sqlalchemy.ext.asyncio import AsyncSession

from app.database import get_db

router = APIRouter(prefix="/speech", tags=["AI-语音"])


@router.post("/transcribe", summary="语音转文字")
async def transcribe(
    audio: UploadFile = File(..., description="音频文件"),
    language: str = Query("zh", description="语言"),
    provider: str = Query("dashscope", description="提供商"),
    db: AsyncSession = Depends(get_db),
):
    """
    语音转文字（ASR）
    
    将音频文件转换为文字，支持：
    - dashscope: 阿里云百炼（默认，推荐）
    - openai: OpenAI Whisper
    
    支持的音频格式：wav, mp3, webm, pcm, opus
    """
    from ai_platform.services.speech_service import SpeechService
    
    service = SpeechService(db=db)
    await service._resolve_dashscope_api_key()
    audio_content = await audio.read()
    result = service.transcribe(
        audio_file=audio_content,
        language=language,
        provider=provider,
    )
    
    if result["success"]:
        return {
            "text": result["text"],
            "duration": result.get("duration", 0),
        }
    else:
        raise HTTPException(status_code=400, detail=result["error"])


@router.post("/tts", summary="文字转语音")
async def text_to_speech(
    text: str = Query(..., description="要转换的文字"),
    voice: str = Query("sambert-zhichu-v1", description="声音"),
    provider: str = Query("dashscope", description="提供商"),
    db: AsyncSession = Depends(get_db),
):
    """
    文字转语音（TTS）
    
    将文字转换为语音，返回音频文件
    
    DashScope 可用声音：
    - sambert-zhichu-v1: 知厨（男声）
    - sambert-zhimiao-emo-v1: 知妙（女声，带情感）
    - sambert-zhiying-v1: 知莺（女声）
    
    OpenAI 可用声音：
    - alloy, echo, fable, onyx, nova, shimmer
    """
    from ai_platform.services.speech_service import SpeechService
    
    service = SpeechService(db=db)
    await service._resolve_dashscope_api_key()
    result = service.text_to_speech(
        text=text,
        voice=voice,
        provider=provider,
    )
    
    if result["success"]:
        return Response(
            content=result["audio_data"],
            media_type=result["content_type"],
            headers={"Content-Disposition": 'attachment; filename="speech.wav"'},
        )
    else:
        raise HTTPException(status_code=400, detail=result["error"])
