# =============================================================================
# 企微IT智能服务台 — 扫码登录业务服务
# =============================================================================
# 说明：封装扫码登录的核心业务逻辑，与 HTTP/路由层解耦。
# 关键设计:
#   1. Redis Key 设计:
#     - qrcode:ticket:{ticket}   → {created_at, expires_at}, TTL 120s
#     - qrcode:scan:{ticket}     → {employee_id, name, scanned_at}, TTL 120s
#     - qrcode:confirm:{ticket}  → {token, confirmed_at, roles}, TTL 60s
#   2. 状态机: waiting → scanned → confirmed → (poll 返回 token 后清空 confirm key)
#   3. dev 模式: 跳过企微 OAuth2,使用预设 dev 用户直接模拟扫码结果
# =============================================================================

import base64
import json
import logging
import os
import secrets
from datetime import datetime, timedelta
from io import BytesIO
from typing import Any, Dict, Optional
from urllib.parse import urlencode

import qrcode

import redis.asyncio as aioredis

from app.config import settings

logger = logging.getLogger(__name__)


# --------------------------------------------------------------------------
# 常量
# --------------------------------------------------------------------------
# 票据有效期(秒): 与 Redis TTL 一致
TICKET_TTL_SECONDS = 120
# 扫码结果有效期(秒)
SCAN_TTL_SECONDS = 120
# 确认结果有效期(秒),用于前端轮询拿到 token
CONFIRM_TTL_SECONDS = 60


def _dev_mode_enabled() -> bool:
    """检查是否启用了开发模式。

    三个检查源(任一为 true 即启用):
    1. 环境变量 DEV_MODE=true
    2. settings.dev_mode(从 .env.dev 读)
    """
    if os.getenv("DEV_MODE", "false").lower() == "true":
        return True
    if getattr(settings, "dev_mode", False):
        return True
    return False


class QrcodeService:
    """扫码登录业务服务。

    封装 Redis Key 管理、状态机、token 创建等核心逻辑。
    实例方法都是 async,因为 Redis 操作是异步的。

    Attributes:
        redis: Redis 异步客户端
    """

    def __init__(self, redis_client: aioredis.Redis):
        """初始化扫码登录服务。

        Args:
            redis_client: Redis 异步客户端
        """
        self.redis = redis_client

    # ------------------------------------------------------------------
    # Key 辅助函数
    # ------------------------------------------------------------------
    @staticmethod
    def _ticket_key(ticket: str) -> str:
        """获取票据状态 Key。

        票据本身的存在性记录(120s TTL),用于判断票据是否过期。
        """
        return f"qrcode:ticket:{ticket}"

    @staticmethod
    def _scan_key(ticket: str) -> str:
        """获取扫码结果 Key。

        存放扫码后的企微用户信息(120s T