pp.services.qrcode_service import QrcodeService
from app.utils.response import AppException, success_response

logger = logging.getLogger(__name__)

# 创建路由器
# prefix="/auth_qrcode" + tags=["扫码登录"] 用于 Swagger 分组
router = APIRouter(prefix="/auth_qrcode", tags=["扫码登录"])


def _get_qrcode_service(redis_client: aioredis.Redis) -> QrcodeService:
    """工厂函数: 构造扫码登录业务服务。

    拆出来便于测试时 monkey-patch,以及后续接入 DI。
    """
    return QrcodeService(redis_client)


# --------------------------------------------------------------------------
# POST /api/auth_qrcode/create — 创建扫码登录票据
# --------------------------------------------------------------------------
@router.post("/create", response_model=None)
async def create_qrcode(
    redis_client: aioredis.Redis = Depends(dep_redis),
):
    """创建扫码登录票据。

    无需鉴权(用户尚未登录,正在登录页)。
    返回 ticket + 企微 OAuth2 授权 URL,前端渲染二维码。

    Returns:
        Dict: 统一响应格式,data 字段是 QrcodeCreateResponse
    """
    try:
        service = _get_qrcode_service(redis_client)
        result = await service.create_ticket()

        return success_response(data={
            "ticket": result["ticket"],
            "qrcode_url": result["qrcode_url"],
            "qrcode_png_base64": result["qrcode_png_base64"],
            "expires_in": result["expires_in"],
            "expires_at": result["expires_at"].isoformat(),
        })

    except Exception as e:
        logger.error(f"创建扫码票据异常: {e}", exc_info=True)
        raise AppException(1005, f"创建扫码票据失败: {str(e)}")


# --------------------------------------------------------------------------
# GET /api/auth_qrcode/poll/{ticket} — 前端轮询扫码状态
# --------------------------------------------------------------------------
@router.get("/poll/{ticket}", response_model=None)
async def poll_qrcode(
    ticket: str = Path(..., description="扫码登录票据"),
    redis_client: aioredis.Redis = Depends(dep_redis),
):
    """轮询扫码状态。

    无需鉴权(浏览器未登录态访问)。

    状态机:
      - waiting:   ticket 有效,等待扫码
      - scanned:   已扫码,等待 confirm
      - confirmed: 已确认,返回 token
      - expired:   ticket 过期/不存在

    Returns:
        Dict: 统一响应格式,data 字段是 QrcodePollResponse
    """
    try:
        service = _get_qrcode_service(redis_client)
        result = await service.get_poll_state(ticket)

        return success_response(data={
            "status": result["status"],
            "employee_id": result.get("employee_id"),
            "name": result.get("name"),
            "token": result.get("token"),
        })

    except Exception as e:
        logger.error(f"轮询扫码状态