from __future__ import annotations

import base64
import logging
import os
import time
import uuid

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field

from engine import KaonicTTS

logging.basicConfig(level=os.getenv("LOG_LEVEL", "INFO"))
app = FastAPI(title="Kaonic Text-to-Audio Engine", version="1.0.0")
tts = KaonicTTS()


class TextToAudioRequest(BaseModel):
    text: str = Field(min_length=1, max_length=4000)
    voice: str = Field(default="kaonic-neural", max_length=80)
    language: str = Field(default="en", max_length=16)
    duration: int = Field(default=8, ge=1, le=30)


@app.get("/health")
def health() -> dict[str, str]:
    return tts.health()


@app.post("/synthesize")
def synthesize(request: TextToAudioRequest) -> dict[str, object]:
    started = time.perf_counter()
    try:
        audio = tts.synthesize(request.text, request.voice, request.duration)
        wav = tts.encode_wav(audio)
        elapsed = round(time.perf_counter() - started, 3)
        logging.getLogger("kaonic.tts").info(
            "synthesis_complete id=%s voice=%s language=%s bytes=%d elapsed=%s",
            request_id := uuid.uuid4(), request.voice, request.language, len(wav), elapsed,
        )
        return {
            "id": f"tta_{request_id.hex[:12]}",
            "status": "completed",
            "contentType": "audio/wav",
            "audioBase64": base64.b64encode(wav).decode("ascii"),
            "duration": request.duration,
            "sampleRate": tts.sample_rate,
            "engine": f"kaonic-voice-1-{tts.model_status}",
            "device": tts.device,
            "elapsedSeconds": elapsed,
        }
    except Exception as exc:
        logging.getLogger("kaonic.tts").exception("synthesis_failed")
        raise HTTPException(status_code=500, detail="Audio synthesis failed") from exc
