"""
改进版Python FastAPI服务器实现，使用DashScope Python SDK连接阿里云百炼平台API
拆分模块版本
"""
import os
import json
from datetime import datetime
from pathlib import Path
import dashscope
from dotenv import load_dotenv
from fastapi import FastAPI, HTTPException, File, UploadFile, Request
from fastapi.responses import JSONResponse

# 导入模块
import sys
sys.path.append('/home/mt/project/ai-chat-ui/server_python')

from api.chat_routes import (
    chat_endpoint_handler,
    get_models_handler,
    get_conversations_handler,
    get_conversation_handler,
    save_conversation_handler,
    delete_conversation_handler,
    upload_file_handler,
    serve_upload_handler,
    stop_generation_handler
)
from models.chat_models import ChatRequest, ModelInfo
from utils.helpers import log_request, log_response


# 加载环境变量
load_dotenv()

# 设置 DashScope API 密钥
api_key = os.getenv("ALIYUN_API_KEY")
if not api_key:
    raise ValueError("请在环境变量中设置 ALIYUN_API_KEY")

dashscope.api_key = api_key

# 创建 FastAPI 应用
app = FastAPI(title="AI Chat API Server (Python)", version="2.0.0")


@app.middleware("http")
async def logging_middleware(request: Request, call_next):
    """中间件：记录请求日志"""
    start_time = datetime.utcnow()

    # 记录请求信息
    log_request(request.method, request.url.path, request.client.host if request.client else 'unknown')

    response = await call_next(request)

    # 计算处理时间
    process_time = (datetime.utcnow() - start_time).total_seconds() * 1000

    # 记录响应信息
    log_response(response.status_code, process_time)

    # 在响应头中添加处理时间
    response.headers["X-Process-Time"] = f"{process_time:.2f}ms"

    return response


@app.get("/health")
async def health_check():
    """健康检查端点"""
    return {"status": "healthy", "timestamp": datetime.utcnow().isoformat()}


@app.post("/api/chat-ui/chat")
async def chat_endpoint(request: Request):
    """聊天接口 - 与阿里云百炼API兼容的接口"""
    body = await request.json()
    return await chat_endpoint_handler(body)


@app.get("/api/chat-ui/models")
async def get_models():
    """获取模型列表"""
    return await get_models_handler()


@app.get("/api/chat-ui/conversations")
async def get_conversations():
    """获取所有对话"""
    return await get_conversations_handler()


@app.get("/api/chat-ui/conversations/{conversation_id}")
async def get_conversation(conversation_id: str):
    """获取特定对话"""
    return await get_conversation_handler(conversation_id)


@app.post("/api/chat-ui/conversations")
async def save_conversation(request: Request):
    """保存或更新对话"""
    data = await request.json()
    return await save_conversation_handler(data)


@app.delete("/api/chat-ui/conversations/{conversation_id}")
async def delete_conversation(conversation_id: str):
    """删除对话"""
    return await delete_conversation_handler(conversation_id)


@app.post("/api/chat-ui/upload")
async def upload_file(file: UploadFile = File(...)):
    """文件上传接口"""
    return await upload_file_handler(file=file)


@app.get("/uploads/{filename}")
async def serve_upload(filename: str):
    """提供上传文件的访问"""
    return serve_upload_handler(filename)


@app.post("/api/chat-ui/stop")
async def stop_generation():
    """停止生成接口"""
    return await stop_generation_handler()


@app.post("/api/chat-ui/stop/{message_id}")
async def stop_generation_by_id(message_id: str):
    """根据消息ID停止生成"""
    return await stop_generation_handler(message_id)


if __name__ == "__main__":
    import uvicorn

    port = int(os.getenv("PORT", 8000))
    print("="*50)
    print(f"Python AI Chat Server 启动中...")
    print(f"监听端口: {port}")
    print(f"API Key 状态: {'已配置' if api_key else '未配置'}")
    print("="*50)

    if not api_key:
        print("警告: 未在环境变量中检测到 ALIYUN_API_KEY!")
        print("请在 .env 文件中添加您的百炼 API Key。")
    else:
        print("API Key 已检测到。")

    uvicorn.run(app, host="0.0.0.0", port=port)