#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：auth_helper.py
模块描述：安全测试认证辅助模块，提供多账号登录、Token 管理等功能

作者：czj
创建日期：2026-07-21
最后修改：2026-07-21
"""

import logging
from typing import Dict, Optional

logger = logging.getLogger(__name__)


class AuthHelper:
    """
    认证辅助类，管理多账号登录和 Token 获取

    支持三个测试账号（superadmin/admin/user）的登录和 Token 管理，
    用于越权测试场景中获取不同角色的 Token。
    """

    # 支持的账号键名
    ACCOUNT_KEYS = ["superadmin", "admin", "user"]

    def __init__(self, http_client):
        """
        初始化认证辅助

        Args:
            http_client: HttpClient 实例
        """
        self.client = http_client

    def login_all_accounts(self) -> Dict[str, Optional[str]]:
        """
        使用全部配置账号登录

        Returns:
            dict: {账号键名: Token} 的字典，失败的账号值为 None
        """
        results = {}
        for account_key in self.ACCOUNT_KEYS:
            logger.info(f"尝试登录账号: {account_key}")
            token = self.client.login(account_key)
            results[account_key] = token
            if token:
                logger.info(f"账号 [{account_key}] 登录成功")
            else:
                logger.warning(f"账号 [{account_key}] 登录失败")
        return results

    def get_superadmin_token(self) -> Optional[str]:
        """获取超管 Token"""
        return self.client.get_token("superadmin")

    def get_admin_token(self) -> Optional[str]:
        """获取管理员 Token"""
        return self.client.get_token("admin")

    def get_user_token(self) -> Optional[str]:
        """获取普通用户 Token"""
        return self.client.get_token("user")

    def get_token(self, account_key: str) -> Optional[str]:
        """
        获取指定账号的 Token

        Args:
            account_key: 账号键名

        Returns:
            str: Token 字符串，失败返回 None
        """
        return self.client.get_token(account_key)

    def refresh_all_tokens(self) -> Dict[str, Optional[str]]:
        """
        刷新所有 Token（清除缓存后重新登录）

        Returns:
            dict: {账号键名: 新Token}
        """
        self.client.clear_token()
        return self.login_all_accounts()

    def get_tokens_dict(self) -> Dict[str, str]:
        """
        获取所有已缓存的 Token

        Returns:
            dict: {账号键名: Token}
        """
        return dict(self.client._tokens)

    def test_account(self, account_key: str) -> Dict[str, object]:
        """
        测试指定账号是否可以登录

        Args:
            account_key: 账号键名

        Returns:
            dict: {"success": bool, "token_preview": str, "error": str}
        """
        # 清除旧 Token，强制重新登录
        self.client.clear_token(account_key)

        token = self.client.login(account_key)
        if token:
            return {
                "success": True,
                "token_preview": f"{token[:20]}...{token[-10:]}",
                "error": ""
            }
        else:
            return {
                "success": False,
                "token_preview": "",
                "error": f"账号 {account_key} 登录失败"
            }
