"""键盘输入测试"""

import asyncio
import sys
from pathlib import Path
import pytest

# 添加 src 目录到 Python 路径
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))

from novnc_client import NoVNCClient


@pytest.mark.asyncio
async def test_keyboard_input():
    """测试键盘输入功能"""
    print("开始测试键盘输入...")

    try:
        async with NoVNCClient("localhost", 6080) as client:
            print("[OK] 连接成功")

            # 测试单个字符输入
            await client.key_tap("a")
            print("[OK] 单个字符输入")

            # 测试文本输入
            await client.type_text("Hello World!", delay=0.02)
            print("[OK] 文本输入")

            # 测试特殊按键
            await client.key_tap("enter")
            print("[OK] 特殊按键输入")

            # 测试组合键
            await client.key_combination("ctrl", "a")
            print("[OK] 组合键输入")

            # 测试便捷方法
            await client.key_combination("ctrl", "c")
            print("[OK] Ctrl+C")

            await client.key_combination("ctrl", "v")
            print("[OK] Ctrl+V")

            # 测试方向键
            await client.key_tap("left")
            await client.key_tap("right")
            await client.key_tap("up")
            await client.key_tap("down")
            print("[OK] 方向键")

            # 测试功能键
            await client.key_tap("f1")
            print("[OK] 功能键")

            return True

    except Exception as e:
        print(f"[ERROR] 键盘输入测试失败: {e}")
        import traceback

        traceback.print_exc()
        return False


@pytest.mark.asyncio
async def test_complex_typing():
    """测试复杂输入场景"""
    print("\n开始测试复杂输入场景...")

    try:
        async with NoVNCClient("localhost", 6080) as client:
            # 模拟打开文本编辑器并输入内容 (Ubuntu 系统)
            await client.key_combination("alt", "f2")  # 打开 Ubuntu 运行对话框
            await asyncio.sleep(0.8)  # Ubuntu 可能需要更多时间

            await client.type_text("gedit", delay=0.02)  # 使用 gedit 文本编辑器
            await asyncio.sleep(0.3)

            await client.key_tap("enter")
            await asyncio.sleep(2)  # 等待 gedit 启动，Ubuntu 应用启动稍慢

            # 输入测试内容
            test_content = """这是一个测试文本
包含多行内容
以及一些特殊字符: @#$%^&*()
还有数字: 123456789
测试完成!"""

            await client.type_text(test_content, delay=0.01)
            print("[OK] 复杂文本输入")

            # 测试选择和复制
            await client.key_combination("ctrl", "a")  # 全选
            await asyncio.sleep(0.1)
            await client.key_combination("ctrl", "c")  # 复制
            await asyncio.sleep(0.1)

            await client.key_tap("end")  # 移动到末尾
            await client.key_tap("enter")  # 换行
            await client.key_combination("ctrl", "v")  # 粘贴
            print("[OK] 选择和复制粘贴")

            return True

    except Exception as e:
        print(f"[ERROR] 复杂输入测试失败: {e}")
        import traceback

        traceback.print_exc()
        return False


@pytest.mark.asyncio
async def test_ubuntu_terminal():
    """测试 Ubuntu 终端输入场景"""
    print("\n开始测试 Ubuntu 终端输入场景...")

    try:
        async with NoVNCClient("localhost", 6080) as client:
            # 打开终端 (Ubuntu 通用快捷键)
            await client.key_combination("ctrl", "alt", "t")
            await asyncio.sleep(1.5)  # 等待终端打开

            # 测试终端命令
            await client.type_text("echo 'Hello Ubuntu Terminal!'", delay=0.02)
            await client.key_tap("enter")
            await asyncio.sleep(0.5)

            # 测试 ls 命令
            await client.type_text("ls -la", delay=0.02)
            await client.key_tap("enter")
            await asyncio.sleep(0.5)

            # 测试 pwd 命令
            await client.type_text("pwd", delay=0.02)
            await client.key_tap("enter")
            await asyncio.sleep(0.5)

            # 测试创建和编辑文件
            await client.type_text("nano test_file.txt", delay=0.02)
            await client.key_tap("enter")
            await asyncio.sleep(1)  # 等待 nano 打开

            # 在 nano 中输入测试内容
            test_content = (
                "这是一个测试文件\n包含中文和英文\nTest content in nano editor"
            )
            await client.type_text(test_content, delay=0.01)
            await asyncio.sleep(0.5)

            # 保存并退出 nano
            await client.key_combination("ctrl", "x")  # 退出
            await asyncio.sleep(0.2)
            await client.key_tap("y")  # 确认保存
            await asyncio.sleep(0.2)
            await client.key_tap("enter")  # 确认文件名
            await asyncio.sleep(0.5)

            # 验证文件内容
            await client.type_text("cat test_file.txt", delay=0.02)
            await client.key_tap("enter")
            await asyncio.sleep(0.5)

            # 清理测试文件
            await client.type_text("rm test_file.txt", delay=0.02)
            await client.key_tap("enter")
            await asyncio.sleep(0.2)

            print("[OK] Ubuntu 终端输入测试")
            return True

    except Exception as e:
        print(f"[ERROR] Ubuntu 终端测试失败: {e}")
        import traceback

        traceback.print_exc()
        return False


async def main():
    """主测试函数"""
    print("=== 键盘输入功能测试 (Ubuntu 系统) ===\n")

    # 基础键盘测试
    basic_ok = await test_keyboard_input()

    # 复杂输入测试 (gedit 图形界面)
    complex_ok = await test_complex_typing()

    # Ubuntu 终端测试 (更通用的备选方案)
    terminal_ok = await test_ubuntu_terminal()

    print("\n=== 测试结果 ===")
    print(f"基础键盘测试: {'[OK] 通过' if basic_ok else '[ERROR] 失败'}")
    print(f"gedit 图形界面测试: {'[OK] 通过' if complex_ok else '[ERROR] 失败'}")
    print(f"终端命令行测试: {'[OK] 通过' if terminal_ok else '[ERROR] 失败'}")

    # 至少通过基础测试和其中一个复杂测试即可认为成功
    success = basic_ok and (complex_ok or terminal_ok)

    if success:
        print("\n[SUCCESS] 键盘测试通过！Ubuntu 系统兼容性良好")
        return True
    else:
        print("\n[WARNING] 键盘测试失败，请检查 Ubuntu 系统配置")
        return False


if __name__ == "__main__":
    success = asyncio.run(main())
    sys.exit(0 if success else 1)
