import base64

from fastapi import APIRouter, Body, HTTPException

import config
from agent.bailian_tts import BailianTTS
from agent.deepseek_client import DeepSeekClient
from config import reload_settings
from models.schemas import SettingsOut, SettingsTestResponse, SettingsUpdate
from settings_manager import (
    apply_settings_update,
    get_public_settings,
    write_env_file,
)

router = APIRouter(prefix="/settings", tags=["settings"])


@router.get("", response_model=SettingsOut)
def get_settings():
    return get_public_settings(config.settings)


@router.put("", response_model=SettingsOut)
def update_settings(body: SettingsUpdate):
    updates = apply_settings_update(body.model_dump(exclude_unset=True))
    if not updates:
        raise HTTPException(status_code=400, detail="没有可更新的配置项")
    write_env_file(updates)
    reload_settings()
    return get_public_settings(config.settings)


@router.post("/test", response_model=SettingsTestResponse)
async def test_connection(body: SettingsUpdate = Body(default=SettingsUpdate())):
    updates = apply_settings_update(body.model_dump(exclude_unset=True))
    if updates:
        write_env_file(updates)
        reload_settings()

    current = config.settings

    if not current.deepseek_api_key or current.deepseek_api_key == "sk-your-key-here":
        return SettingsTestResponse(ok=False, message="请先填写 DeepSeek API Key")

    client = DeepSeekClient()
    try:
        reply = await client.chat(
            [
                {"role": "user", "content": "请回复：连接成功"},
            ],
            model=current.deepseek_model,
        )
        return SettingsTestResponse(
            ok=True,
            message=f"连接成功，模型回复：{reply[:80]}",
            model=current.deepseek_model,
        )
    except Exception as exc:
        return SettingsTestResponse(ok=False, message=f"连接失败：{exc}")


@router.post("/test-tts", response_model=SettingsTestResponse)
async def test_tts(body: SettingsUpdate = Body(default=SettingsUpdate())):
    updates = apply_settings_update(body.model_dump(exclude_unset=True))
    if updates:
        write_env_file(updates)
        reload_settings()

    tts = BailianTTS()
    if not tts.is_configured():
        return SettingsTestResponse(ok=False, message="请先填写阿里云百炼 API Key")

    try:
        message = await tts.test_connection()
        return SettingsTestResponse(
            ok=True,
            message=message,
            model=config.settings.tts_model,
        )
    except Exception as exc:
        return SettingsTestResponse(ok=False, message=f"语音合成失败：{exc}")
