from fastapi import APIRouter, HTTPException, Query, Response
from fastapi.responses import StreamingResponse
from app.api.dependencies import ServiceContainer
from app.api import schemas
from typing import AsyncGenerator

def create_tts_router(services: ServiceContainer) -> APIRouter:
    router = APIRouter(prefix="/speech", tags=["TTS"])

    @router.post(
        "",
        summary="Generate speech from text",
        response_description="Audio bytes in WAV format, either as a complete file or a stream.",
    )
    async def create_speech_response(
        request: schemas.SpeechRequest,
        stream: bool = Query(
            False,
            description="If true, returns a streamed audio response. Otherwise, returns a complete file."
        )
    ):
        try:
            if stream:
                audio_stream_generator: AsyncGenerator[bytes, None] = services.tts_service.create_speech_stream(
                    text=request.text
                )
                return StreamingResponse(audio_stream_generator, media_type="audio/wav")
            else:
                audio_bytes = await services.tts_service.create_speech_non_stream(
                    text=request.text
                )
                return Response(content=audio_bytes, media_type="audio/wav")

        except HTTPException:
            raise
        except Exception as e:
            raise HTTPException(
                status_code=500, detail=f"Failed to generate speech: {e}"
            )
    
    return router