"""
Flask应用主入口文件。

负责初始化Flask应用、设置核心服务、注册API路由蓝图以及启动服务。
"""
from flask import Flask, request, abort

from config import Config
from logger_config import get_logger
from core.app_state import login as initialize_trader_login, is_real_mode
from core.scheduler_tasks import setup_scheduler

# API 路由蓝图
from routes.health_routes import health_bp
from routes.trading_routes import trading_bp
from routes.account_routes import account_bp
from routes.strategy_routes import strategy_bp

# 主日志记录器 (可以根据需要选择使用 app_state_logger 或 scheduler_logger, 或者独立的)
logger = get_logger("trade_server_main")

# 创建 Flask 应用实例
app = Flask(__name__)

# --- 应用初始化和设置 ---

def initialize_app_services():
    """初始化应用核心服务，如交易系统登录和定时任务。"""
    logger.info("开始初始化应用服务...")
    try:
        # 1. 尝试初始登录交易系统
        # login 函数现在位于 app_state.py
        login_success = initialize_trader_login()
        if not login_success and is_real_mode():
            logger.warning("主程序：初始登录失败，系统将在后台尝试重连。")
        else:
            logger.info("主程序：交易系统登录步骤完成。")

        # 2. 设置并启动调度器
        # setup_scheduler 函数现在位于 scheduler_tasks.py
        setup_scheduler()
        logger.info("主程序：定时任务调度器已设置并启动。")
        
        logger.info("应用服务初始化完成。")

    except Exception as e:
        logger.error(f"主程序：交易系统或调度器初始化异常: {e}", exc_info=True)
        # 即使部分初始化失败，也尝试继续，让Flask应用能启动（可能API部分功能受限）
        # 如果调度器启动失败是关键错误，可以考虑在这里重新抛出异常或退出
        if "setup_scheduler" not in str(e): # 避免重复日志
            try:
                logger.info("尝试单独启动调度器...")
                setup_scheduler()
            except Exception as scheduler_e:
                logger.error(f"主程序：调度器单独启动也失败: {scheduler_e}", exc_info=True)
                # 根据关键性决定是否在此处 raise scheduler_e

# --- Flask 中间件和路由注册 ---

@app.before_request
def check_path_prefix() -> None:
    """中间件：拦截所有不以 /yu 开头的请求并返回404。"""
    if not request.path.startswith('/yu'):
        # 允许访问 Flask 的静态文件，例如 /static/...
        if not request.path.startswith(app.static_url_path or '/static'): 
            logger.warning(f"拦截非法路径请求: {request.path}")
            abort(404)

# 注册蓝图
app.register_blueprint(health_bp) 
app.register_blueprint(trading_bp)
app.register_blueprint(account_bp)
app.register_blueprint(strategy_bp)

logger.info("所有API路由蓝图已注册。")

def run_server():
    # 在启动Web服务器之前初始化服务
    initialize_app_services() 
    
    logger.info(f"Flask 服务器准备在 {Config.HOST}:{Config.PORT} 启动...")
    app.run(debug=Config.DEBUG, host=Config.HOST, port=Config.PORT, use_reloader=False)
    # use_reloader=False 建议在生产或有自定义启动/关闭逻辑时使用，以避免重复初始化。
    # 对于开发模式，debug=True 通常会启用重载器。

# --- 主程序入口 ---
if __name__ == "__main__":
    run_server()
else:
    # 如果是通过 Gunicorn 等 WSGI 服务器运行，则也需要初始化服务
    # Gunicorn 通常会为每个 worker 进程加载一次应用模块
    initialize_app_services()
