from PIL import Image
import numpy as np
import uvicorn
import threading
import time
import os
from fastapi import FastAPI
# 新增：导入 CORS 相关依赖
from fastapi.middleware.cors import CORSMiddleware

# 导入 Flask 服务实例
from app import app as flask_app

# 原有业务导入
from core.all import load_model, detect
from ds.config import SERVER_CONFIG
from middle.error_handler import global_exception_handler
from service.user_service import router as user_router
from service.sensitive_service import router as sensitive_router
from service.face_service import router as face_router
from service.device_service import router as device_router
from service.model_service import router as model_router  # 模型管理路由
from ws.ws import ws_router, lifespan
from core.establish import create_directory_structure


# Flask 服务启动函数（不变）
def start_flask_service():
    try:
        print(f"\n[Flask 服务] 准备启动，端口：5000")
        print(f"[Flask 服务] 访问示例：http://服务器IP:5000/resource/dect/ocr/xxx.jpg\n")

        BASE_IMAGE_DIR = os.path.abspath(os.path.join("resource", "dect"))
        if not os.path.exists(BASE_IMAGE_DIR):
            print(f"[Flask 服务] 图片根目录不存在，创建：{BASE_IMAGE_DIR}")
            os.makedirs(BASE_IMAGE_DIR, exist_ok=True)

        flask_app.run(
            host="0.0.0.0",
            port=5000,
            debug=False,
            use_reloader=False
        )
    except Exception as e:
        print(f"[Flask 服务] 启动失败：{str(e)}")


# 初始化 FastAPI 应用（新增 CORS 配置）
app = FastAPI(
    title="内容安全审核后台",
    description="含图片访问服务和动态模型管理",
    version="1.0.0",
    lifespan=lifespan
)

# ------------------------------
# 新增：完整 CORS 配置（解决跨域问题）
# ------------------------------
# 1. 允许的前端域名（根据实际情况修改！本地开发通常是 http://localhost:8080 等）
ALLOWED_ORIGINS = [
    # "http://localhost:8080",  # 前端本地开发地址（必改，填实际前端地址）
    # "http://127.0.0.1:8080",
    # "http://服务器IP:8080",    # 部署后前端地址（如适用）
    "*" #表示允许所有域名（开发环境可用，生产环境不推荐）
]

# 2. 配置 CORS 中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=ALLOWED_ORIGINS,        # 允许的前端域名
    allow_credentials=True,               # 允许携带 Cookie（如需登录态则必开）
    allow_methods=["*"],                  # 允许所有 HTTP 方法（包括 PUT/DELETE）
    allow_headers=["*"],                  # 允许所有请求头（包括 Content-Type）
)

# 注册路由（不变）
app.include_router(user_router)
app.include_router(device_router)
app.include_router(face_router)
app.include_router(sensitive_router)
app.include_router(model_router)  # 模型管理路由
app.include_router(ws_router)

# 注册全局异常处理器（不变）
app.add_exception_handler(Exception, global_exception_handler)

# 主服务启动入口（不变）
if __name__ == "__main__":
    # 1. 初始化资源
    create_directory_structure()
    print(f"[初始化] 目录结构创建完成")

    # 创建模型保存目录
    MODEL_SAVE_DIR = os.path.join("core", "models")
    os.makedirs(MODEL_SAVE_DIR, exist_ok=True)
    print(f"[初始化] 模型保存目录：{MODEL_SAVE_DIR}")

    # # 模型路径配置
    # YOLO_MODEL_PATH = os.path.join("core", "models", "best.pt")
    # OCR_CONFIG_PATH = os.path.join("core", "config", "config.yaml")
    # print(f"[初始化] 默认YOLO模型路径：{YOLO_MODEL_PATH}")
    # print(f"[初始化] OCR 配置路径：{OCR_CONFIG_PATH}")

    # 加载检测模型
    try:
        load_success = load_model()
        if load_success:
            print(f"[初始化] 检测模型加载完成")
        else:
            print(f"[初始化] 未找到默认模型，可通过API上传并设置默认模型")
    except Exception as e:
        print(f"[初始化] 模型加载警告：{str(e)}（服务仍启动）")



    # 2. 启动 Flask 服务（子线程）
    flask_thread = threading.Thread(
        target=start_flask_service,
        daemon=True
    )
    flask_thread.start()

    # 等待 Flask 初始化
    time.sleep(1)
    if flask_thread.is_alive():
        print(f"[Flask 服务] 启动成功（运行中）")
    else:
        print(f"[Flask 服务] 启动失败！图片访问不可用")

    # 3. 启动 FastAPI 主服务
    port = int(SERVER_CONFIG.get("port", 8000))
    print(f"\n[FastAPI 服务] 准备启动，端口：{port}")
    print(f"[FastAPI 服务] 接口文档：http://服务器IP:{port}/docs\n")

    uvicorn.run(
        app="main:app",
        host="0.0.0.0",
        port=port,
        workers=1,
        ws="websockets",
        reload=False
    )