import time
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
from multiprocessing import Process, Event, freeze_support, Manager
from loguru import logger

from liveMan import DouyinLiveWebFetcher, DouyinLiveWebReply
from helper import PromptQueue, LiveChatConfig

logger.add('log.log', encoding='utf-8', rotation="500MB")

# FastAPI应用实例
app = FastAPI(title="直播状态控制接口")

# 请求体模型
class SpeakingStatus(BaseModel):
    is_speaking: bool

# 全局变量，用于在FastAPI进程中存储共享字典引用
app.state.shared_config = None

# 接口：更新is_speaking状态
@app.post("/speaking-status", summary="更新说话状态")
def update_speaking_status(status: SpeakingStatus):
    if app.state.shared_config is None:
        return {"error": "服务未初始化"}
    app.state.shared_config['is_speaking'] = status.is_speaking
    # logger.info(f"通过API更新is_speaking状态为: {status.is_speaking}")
    return {
        "message": "状态更新成功",
        "current_status": {
            "is_speaking": app.state.shared_config['is_speaking'],
        }
    }

# 启动FastAPI服务的函数，接收共享字典作为参数
def start_fastapi_server(shared_config):
    # 将共享字典存储到FastAPI应用的状态中
    app.state.shared_config = shared_config
    # 启动UVicorn服务器
    uvicorn.run(app, host="0.0.0.0", port=8000)

def fetch_user_chat_content(ws_open_event, queue):
    fetcher = DouyinLiveWebFetcher(ws_open_event, queue)
    fetcher.start()

def reply_user_chat_content(queue, config):
    reply = DouyinLiveWebReply(queue, config)
    reply()

if __name__ == '__main__':
    freeze_support()

    LiveChatConfig().update_chat_enable_status('启动中')
    with Manager() as manager:
        # 创建共享字典，包含所有需要的键
        shared_config = manager.dict({
            'is_speaking': False
        })
        queue = PromptQueue(10)
        ws_open_event = Event()

        # 创建进程时将共享字典传递给FastAPI服务
        api_process = Process(
            target=start_fastapi_server,
            args=(shared_config,),
            name="FastAPI Server"
        )
        fetch_process = Process(
            target=fetch_user_chat_content,
            args=(ws_open_event, queue)
        )
        reply_process = Process(
            target=reply_user_chat_content,
            args=(queue, shared_config)
        )

        # 启动所有进程
        api_process.start()
        fetch_process.start()
        ws_open_event.wait()
        reply_process.start()

        # 等待所有进程完成
        fetch_process.join()
        reply_process.join()
        api_process.join()
