"""
U盘模式检测模块

检测应用是否运行在 U 盘（可移动驱动器）上，支持：
1. 自动检测：EXE 所在盘为 Windows 可移动驱动器
2. 手动标记：EXE 目录下存在 .usb_mode 文件

用法：
    from app.core.usb_mode import is_usb_mode
    if is_usb_mode():
        # U盘模式逻辑
"""
import os
import sys
import ctypes
import logging

logger = logging.getLogger(__name__)

# 缓存检测结果
_cached: bool | None = None

# Windows GetDriveTypeW 返回值
_DRIVE_REMOVABLE = 2
_DRIVE_FIXED = 3


def _get_drive_type(path: str) -> int:
    """获取指定路径所在驱动器的类型（Windows API）"""
    try:
        drive = os.path.splitdrive(path)[0]
        if not drive:
            return 0
        # 确保格式为 "X:\"
        if not drive.endswith("\\"):
            drive += "\\"
        return ctypes.windll.kernel32.GetDriveTypeW(drive)
    except Exception:
        return 0


def is_usb_mode() -> bool:
    """
    检测当前是否为 U 盘模式

    优先级：
    1. EXE 目录下存在 .usb_mode 文件 → 强制启用
    2. EXE 所在盘为可移动驱动器（DRIVE_REMOVABLE）→ 自动启用
    3. 其他情况 → 普通单机模式
    """
    global _cached
    if _cached is not None:
        return _cached

    # 获取 EXE 所在目录
    if getattr(sys, 'frozen', False):
        exe_dir = os.path.dirname(sys.executable)
    else:
        # 开发模式：bff-api/app/core/usb_mode.py → 向上 3 层到项目根
        exe_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

    # 1. 手动标记文件
    marker_file = os.path.join(exe_dir, ".usb_mode")
    if os.path.exists(marker_file):
        _cached = True
        logger.info("U盘模式已启用（检测到 .usb_mode 标记文件）")
        return _cached

    # 2. 自动检测可移动驱动器
    drive_type = _get_drive_type(exe_dir)
    if drive_type == _DRIVE_REMOVABLE:
        _cached = True
        logger.info(f"U盘模式已启用（检测到可移动驱动器: {os.path.splitdrive(exe_dir)[0]}）")
        return _cached

    _cached = False
    logger.info(f"单机模式（驱动器类型: {drive_type}）")
    return _cached
