"""
Hawk 网络层 - 仅做合法网络恢复：开 WiFi、打开设置、连接已保存网络、重试

不包含且永不包含：破解密码、未授权访问、绕过认证等任何违规操作。
若设备上无可用已保存网络，仅打开系统 WiFi 设置供用户手动连接或输入密码。
"""

import logging
import time
from typing import Dict, Any

logger = logging.getLogger(__name__)


def _shell_out(device, cmd: str) -> str:
    """执行 shell 并返回输出字符串（兼容 u2 的 AdbDevice）。"""
    try:
        r = device.shell(cmd)
        return (getattr(r, "output", None) or str(r) or "").strip()
    except Exception:
        return ""


def is_network_available(device) -> bool:
    """检测当前是否有网络（ping 或 shell 查连接状态）。"""
    try:
        out = _shell_out(device, "ping -c 1 -W 2 8.8.8.8 2>/dev/null && echo ok || echo fail")
        if out and "ok" in out:
            return True
        out = _shell_out(device, "dumpsys wifi | grep -i 'mWifiInfo' | head -1")
        return "SSID:" in out
    except Exception as e:
        logger.debug(f"is_network_available: {e}")
        return False


def try_reconnect_network(device, max_steps: int = 5) -> Dict[str, Any]:
    """
    在设备上尝试恢复网络（仅合法操作）：
    1. 开 WiFi（若被关）
    2. 打开系统「网络/WiFi」设置页，便于连接已保存网络或用户手动输入
    3. 可选：通过 UI 点击「已保存网络」进行连接（不输入新密码、不破解）
    4. 等待后再次检测网络

    device: uiautomator2 设备对象（可为 None，此时只返回建议）
    """
    result = {"success": False, "message": "", "steps": []}

    if device is None:
        result["message"] = "无设备句柄，无法执行网络恢复"
        return result

    try:
        # Step 1: 尝试通过 shell 开启 WiFi（合法系统 API）
        try:
            device.shell("svc wifi enable 2>/dev/null")
            result["steps"].append("svc wifi enable")
            time.sleep(2)
        except Exception as e:
            result["steps"].append(f"svc wifi enable 失败: {e}")

        if is_network_available(device):
            result["success"] = True
            result["message"] = "WiFi 已开启且检测到网络"
            return result

        # Step 2: 打开系统设置中的网络/WiFi 页面，供用户连接或输入密码
        try:
            device.app_start("com.android.settings")
            time.sleep(1.5)
            # 尝试进入 WLAN / 网络 / WiFi 设置
            for text in ["WLAN", "网络", "Wi‑Fi", "WiFi", "互联网"]:
                try:
                    if device(text=text).wait(timeout=2):
                        device(text=text).click()
                        result["steps"].append(f"打开设置并点击 {text}")
                        break
                except Exception:
                    continue
            time.sleep(2)
        except Exception as e:
            result["steps"].append(f"打开设置失败: {e}")

        # Step 3: 若有「已保存」或「已知网络」列表，可点击第一个尝试连接（仅限已保存，不涉及破解）
        try:
            for hint in ["已保存", "已知网络", "已连接", "连接"]:
                if device(textContains=hint).wait(timeout=1.5):
                    device(textContains=hint).click()
                    result["steps"].append(f"点击包含「{hint}」的项")
                    time.sleep(2)
                    break
        except Exception:
            pass

        # Step 4: 再次检测
        time.sleep(2)
        if is_network_available(device):
            result["success"] = True
            result["message"] = "网络已恢复（已连接或已打开设置）"
        else:
            result["message"] = "已打开 WiFi 设置，请在本机选择已保存网络或手动输入密码连接"
            result["steps"].append("建议用户在设置页手动连接")

    except Exception as e:
        logger.exception("try_reconnect_network 异常")
        result["message"] = str(e)
        result["steps"].append(f"异常: {e}")

    return result
