"""
CosyVoice TTS adapter for xiaozhi-esp32-server custom TTS.
Accepts POST /tts with JSON {"text": "...", "speed": 1.0}
Forwards to CosyVoice /tts/stream as form-urlencoded
Returns raw WAV audio bytes.
"""

import os
import json
import logging
import urllib.request
import urllib.parse
from http.server import BaseHTTPRequestHandler, HTTPServer

COSYVOICE_URL = os.getenv("COSYVOICE_URL", "http://127.0.0.1:8001/tts/stream")
PORT = int(os.getenv("ADAPTER_PORT", "8560"))

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger("cosyvoice_adapter")


class Handler(BaseHTTPRequestHandler):
    def log_message(self, format, *args):
        logger.info("%s - %s", self.address_string(), format % args)

    def do_POST(self):
        if self.path != "/tts":
            self.send_response(404)
            self.end_headers()
            return

        length = int(self.headers.get("Content-Length", 0))
        body = self.rfile.read(length)

        try:
            data = json.loads(body)
        except Exception:
            self.send_response(400)
            self.end_headers()
            return

        text = data.get("text", "")
        speed = float(data.get("speed", 1.0))

        form_data = urllib.parse.urlencode({"text": text, "speed": speed}).encode()
        req = urllib.request.Request(
            COSYVOICE_URL,
            data=form_data,
            headers={"Content-Type": "application/x-www-form-urlencoded"},
            method="POST",
        )
        try:
            with urllib.request.urlopen(req, timeout=30) as resp:
                audio = resp.read()
            logger.info("TTS ok: %d chars → %d bytes", len(text), len(audio))
            self.send_response(200)
            self.send_header("Content-Type", "audio/wav")
            self.send_header("Content-Length", str(len(audio)))
            self.end_headers()
            self.wfile.write(audio)
        except Exception as e:
            logger.error("CosyVoice error: %s", e)
            self.send_response(502)
            self.end_headers()

    def do_GET(self):
        if self.path == "/health":
            body = b'{"status":"ok"}'
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.send_header("Content-Length", str(len(body)))
            self.end_headers()
            self.wfile.write(body)
        else:
            self.send_response(404)
            self.end_headers()


if __name__ == "__main__":
    server = HTTPServer(("0.0.0.0", PORT), Handler)
    logger.info("CosyVoice adapter listening on port %d → %s", PORT, COSYVOICE_URL)
    server.serve_forever()
