using System;
using System.Collections;
using System.Collections.Generic;
using TapTapMiniGame;
using UnityEngine;
using UnityEngine.UIElements;
using System.IO;
using System.Text.RegularExpressions;

/// <summary>
/// TapTap小游戏SDK示例代码
/// 本示例展示了TapTap小游戏SDK的主要API使用方法
/// 注意：示例中的参数仅供参考，实际使用时请替换为您的有效值
/// </summary>
public class TapMiniGameDemo : MonoBehaviour
{
    public static MainPanel mainPanel;

    #region 基础
    public static void Tap_InitSDK()
    {
        // 小游戏初始化SDK
        Tap.InitSDK((code) =>
        {
            mainPanel.ShowLog($"TapTap小游戏SDK初始 code：{code}");
        });
    }

    public static void Tap_Login()
    {
        // 登录接口
        LoginOption option = new LoginOption();
        option.complete = (result) =>
        {
            mainPanel.ShowLog($"登录完成: {result.errMsg}");
        };
        option.success = (result) =>
        {
            mainPanel.ShowLog($"登录成功: code={result.code}");
        };
        option.fail = (result) =>
        {
            mainPanel.ShowColorLog($"登录失败: {result.errMsg}", "red");
        };
        
        Tap.Login(option);
        mainPanel.ShowLog("正在调用登录接口...");
    }

    public static void Tap_CheckSession()
    {
        // 检查会话状态
        CheckSessionOption option = new CheckSessionOption();
        option.complete = (result) =>
        {
            mainPanel.ShowLog($"会话检查完成: {result.errMsg}");
        };
        option.success = (result) =>
        {
            mainPanel.ShowLog("会话有效");
        };
        option.fail = (result) =>   
        {
            mainPanel.ShowColorLog($"会话无效，需要重新登录: {result.errMsg}", "red");
        };
        
        Tap.CheckSession(option);
        mainPanel.ShowLog("正在检查会话状态...");
    }

    public static void Tap_Authorize()
    {
        // 用户授权
        AuthorizeOption option = new AuthorizeOption();
        option.scope = "scope.userInfo"; // 用户信息授权范围
        option.complete = (result) =>
        {
            mainPanel.ShowLog($"授权请求完成: {result.errMsg}");
        };
        option.success = (result) =>
        {
            mainPanel.ShowLog("授权成功");
        };
        option.fail = (result) =>
        {
            mainPanel.ShowColorLog($"授权失败: {result.errMsg}", "red");
        };
        
        Tap.Authorize(option);
        mainPanel.ShowLog("正在请求用户授权...");
    }

    public static void Tap_GetUserInfo()
    {
        // 获取用户信息
        GetUserInfoOption option = new GetUserInfoOption();
        option.complete = (result) =>
        {
            mainPanel.ShowLog($"获取用户信息请求完成: {result.errMsg}");
        };
        option.success = (result) =>
        {
            mainPanel.ShowLog($"获取用户信息成功: {result.userInfo.nickName}");
        };
        option.fail = (result) =>
        {
            mainPanel.ShowColorLog($"获取用户信息失败: {result.errMsg}", "red");
        };
        
        Tap.GetUserInfo(option);
        mainPanel.ShowLog("正在获取用户信息...");
    }

    public static void Tap_OpenPrivacyContract()
    {
        // 打开隐私协议
        OpenPrivacyContractOption option = new OpenPrivacyContractOption();
        option.complete = (result) =>
        {
            mainPanel.ShowLog($"隐私协议操作完成: {result.errMsg}");
        };
        option.success = (result) =>
        {
            mainPanel.ShowLog("成功打开隐私协议");
        };
        option.fail = (result) =>
        {
            mainPanel.ShowColorLog($"打开隐私协议失败: {result.errMsg}", "red");
        };
        
        Tap.OpenPrivacyContract(option);
        mainPanel.ShowLog("正在打开隐私协议...");
    }

    public static void Tap_GetSystemInfo()
    {
        // 获取系统信息
        GetSystemInfoOption option = new GetSystemInfoOption();
        option.complete = (result) =>
        {
            mainPanel.ShowLog("获取系统信息完成");
        };
        option.success = (result) =>
        {
            mainPanel.ShowLog($"系统信息: 平台={result.platform}, 语言={result.language}, 系统版本={result.system}");
        };
        option.fail = (result) =>
        {
            mainPanel.ShowColorLog($"获取系统信息失败: {result.errMsg}", "red");
        };
        
        Tap.GetSystemInfo(option);
        mainPanel.ShowLog("正在获取系统信息...");
    }

    public static void Tap_GetDeviceInfo()
    {
        // 获取设备信息
        DeviceInfo info = Tap.GetDeviceInfo();
        if (info != null)
        {
            mainPanel.ShowLog($"设备信息:\n品牌: {info.brand}\n型号: {info.model}\n平台: {info.platform}\n系统: {info.system}");
        }
        else
        {
            mainPanel.ShowLog("获取设备信息失败");
        }
    }

    public static void Tap_HasHomeScreenWidgetAndPinned()
    {
        // 检查桌面小组件
        mainPanel.ShowLog("正在检查桌面小组件状态...");

        HasHomeScreenWidgetOption option = new HasHomeScreenWidgetOption();
        option.success = (HasHomeScreenWidgetOptionResult result) =>
        {
            mainPanel.ShowLog($"桌面小组件状态检查成功：\n" +
                            $"是否有桌面小组件：{(result.hasWidget ? "是" : "否")}\n" +
                            $"是否已固定：{(result.isPinned ? "是" : "否")}");
        };
        option.fail = (TapCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"桌面小组件状态检查失败：{result.errMsg}", "red");
        };
        option.complete = (TapCallbackResult result) =>
        {
            mainPanel.ShowLog("桌面小组件状态检查操作完成");
        };

        Tap.HasHomeScreenWidgetAndPinned(option);
    }

    public static void Tap_CreateHomeScreenWidget()
    {
        // 创建桌面小组件
        mainPanel.ShowLog("正在创建桌面小组件...");

        CreateHomeScreenWidgetOption option = new CreateHomeScreenWidgetOption();
        option.success = (TapCallbackResult result) =>
        {
            mainPanel.ShowLog("桌面小组件创建成功");
        };
        option.fail = (CreateHomeScreenWidgetOptionResult result) =>
        {
            mainPanel.ShowColorLog($"桌面小组件创建失败! Code:{result.errNo}, errMsg:{result.errMsg}", "red");
        };
        option.complete = (TapCallbackResult result) =>
        {
            mainPanel.ShowLog("桌面小组件创建操作完成");
        };

        Tap.CreateHomeScreenWidget(option);
    }

    #endregion

    #region UI交互
    public static void Tap_Shared()
    {
        mainPanel.ShowLog("正在调用分享功能...");
        Tap.ShowShareboard(new ShowShareboardOption
        {
            title = "分享标题",
            desc = "分享文案",
            success = (res) =>
            {
                mainPanel.ShowLog("[ShowShareboard] 分享成功:" + res.errMsg);
            },
            fail = (res) =>
            {
                mainPanel.ShowColorLog($"[ShowShareboard] 分享失败: {res.errMsg}", "red");
            },
            complete = (res) =>
            {
                mainPanel.ShowLog("[ShowShareboard] 分享操作完成");
            }
        });
    }
    
    public static void Tap_ShowToast()
    {
        mainPanel.ShowLog("正在显示Toast提示...");
        ShowToastOption option = new ShowToastOption();
        option.title = "测试 内容区域：测试换行\n第二行\n第三行";
        option.duration = 1;
        option.complete = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"Toast显示完成, errMsg: {GeneralCallbackResult.errMsg}");
        };
        option.success = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"Toast显示成功, errMsg: {GeneralCallbackResult.errMsg}");
        };
        option.fail = (GeneralCallbackResult) =>
        {
            mainPanel.ShowColorLog($"Toast显示失败, errMsg: {GeneralCallbackResult.errMsg}", "red");
        };
        Tap.ShowToast(option);
    }
    
    public static void Tap_SetEnableDebug()
    {
        mainPanel.ShowLog("正在启用调试模式...");
        SetEnableDebugOption option = new SetEnableDebugOption();
        option.enableDebug = true;
        option.complete = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"调试模式设置完成, errMsg: {GeneralCallbackResult.errMsg}");
        };
        option.success = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"调试模式启用成功, errMsg: {GeneralCallbackResult.errMsg}");
        };
        option.fail = (GeneralCallbackResult) =>
        {
            mainPanel.ShowColorLog($"调试模式启用失败, errMsg: {GeneralCallbackResult.errMsg}", "red");
        };
        Tap.SetEnableDebug(option);
    }
    
    public static void Tap_ShowLoading()
    {
        mainPanel.ShowLog("正在显示加载提示...");
        ShowLoadingOption option = new ShowLoadingOption();
        option.title = "加载中...";
        option.mask = true;
        option.complete = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"加载提示显示完成, errMsg: {GeneralCallbackResult.errMsg}");
        };
        option.success = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"加载提示显示成功, errMsg: {GeneralCallbackResult.errMsg}");
            
            // 2秒后隐藏loading
            mainPanel.StartCoroutine(HideLoadingAfterDelay(2.0f));
        };
        option.fail = (GeneralCallbackResult) =>
        {
            mainPanel.ShowColorLog($"加载提示显示失败, errMsg: {GeneralCallbackResult.errMsg}", "red");
        };
        Tap.ShowLoading(option);
    }
    
    private static IEnumerator HideLoadingAfterDelay(float delay)
    {
        yield return new WaitForSeconds(delay);
        
        HideLoadingOption hideOption = new HideLoadingOption();
        hideOption.complete = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"HideLoading complete, errMsg: {GeneralCallbackResult.errMsg}");
        };
        hideOption.success = (GeneralCallbackResult) =>
        {
            Debug.Log($"HideLoading success, errMsg: {GeneralCallbackResult.errMsg}");
            mainPanel.ShowLog("已隐藏加载提示");
        };
        hideOption.fail = (GeneralCallbackResult) =>
        {
            Debug.Log($"HideLoading fail, errMsg: {GeneralCallbackResult.errMsg}");
            mainPanel.ShowColorLog("隐藏加载框失败", "red");
        };
        Tap.HideLoading(hideOption);
    }
    
    public static void Tap_ShowModal()
    {
        mainPanel.ShowLog("正在显示模态对话框...");
        ShowModalOption option = new ShowModalOption();
        option.title = "提示";
        option.content = "这是一个模态对话框示例";
        option.showCancel = true;
        option.cancelText = "取消";
        option.cancelColor = "#999999";
        option.confirmText = "确定";
        option.confirmColor = "#3CC51F";
        option.complete = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"对话框操作完成, errMsg: {GeneralCallbackResult.errMsg}");
        };
        option.success = (ShowModalSuccessCallbackResult) =>
        {
            if (ShowModalSuccessCallbackResult.confirm)
                mainPanel.ShowLog("用户点击了确定按钮");
            else if (ShowModalSuccessCallbackResult.cancel)
                mainPanel.ShowLog("用户点击了取消按钮");
        };
        option.fail = (GeneralCallbackResult) =>
        {
            mainPanel.ShowColorLog($"对话框显示失败: {GeneralCallbackResult.errMsg}", "red");
        };
        Tap.ShowModal(option);
    }
    #endregion
    
    #region 缓存/文件

    public static void Tap_WriteFileSync()
    {
        string filePath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_sync.txt");
        string content = "这是通过WriteFileSync写入的测试内容 - " + System.DateTime.Now.ToString();
        
        mainPanel.ShowLog($"正在写入文件(同步): {filePath}");
        
        try
        {
            string result = Tap.GetFileSystemManager().WriteFileSync(filePath, content);
            
            // 检查返回结果是否包含错误码
            if (!FileSystemStats.CheckFileSystemError(result))
            {
                // 如果包含错误码，尝试解析错误码
                int errorCode = FileSystemStats.ParseErrorCode(result);
                if (errorCode != 0)
                {
                    // 获取错误描述并显示
                    string errorDescription = FileSystemStats.GetErrorDescription(errorCode);
                    mainPanel.ShowColorLog($"同步写入文件失败: 错误码 {errorCode}，{errorDescription}", "red");
                }
                else
                {
                    // 包含错误但无法解析具体错误码
                    mainPanel.ShowColorLog($"同步写入文件失败: {result}", "red");
                }
            }
            else
            {
                // 写入成功
                mainPanel.ShowLog($"同步写入文件成功: {result}");
            }
        }
        catch (Exception e)
        {
             mainPanel.ShowColorLog($"同步写入文件异常: {e.Message}", "red");
        }
    }

    public static void Tap_WriteFile()
    {
        string filePath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_async.txt");
        string content = "这是通过WriteFile写入的测试内容 - " + System.DateTime.Now.ToString();
        
        mainPanel.ShowLog($"正在写入文件(异步): {filePath}");
        
        WriteFileStringParam param = new WriteFileStringParam
        {
            filePath = filePath,
            data = content,
            encoding = "utf8",
            success = (res) =>
            {
                mainPanel.ShowLog($"异步写入文件成功: {res.errMsg}");
            },
            fail = (res) =>
            {
                mainPanel.ShowColorLog($"异步写入文件失败: {res.errMsg}", "red");
            },
            complete = (res) =>
            {
                mainPanel.ShowLog("文件写入操作完成");
            }
        };
        
        Tap.GetFileSystemManager().WriteFile(param);
    }

    public static void Tap_ReadFileSync()
    {
        string filePath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_sync.txt");
        
        mainPanel.ShowLog($"正在读取文件(同步): {filePath}");
        
        try
        {
            string result = Tap.GetFileSystemManager().ReadFileSync(filePath, "utf8");
            
            // 检查返回结果是否包含错误码
            if (!FileSystemStats.CheckFileSystemError(result))
            {
                // 如果包含错误码，尝试解析错误码
                int errorCode = FileSystemStats.ParseErrorCode(result);
                if (errorCode != 0)
                {
                    // 获取错误描述并显示
                    string errorDescription = FileSystemStats.GetErrorDescription(errorCode);
                    mainPanel.ShowColorLog($"同步读取文件失败: 错误码 {errorCode}，{errorDescription}", "red");
                }
                else
                {
                    // 包含错误但无法解析具体错误码
                    mainPanel.ShowColorLog($"同步读取文件失败: {result}", "red");
                }
            }
            else
            {
                // 读取成功，显示文件内容
                mainPanel.ShowLog($"同步读取文件成功，内容: {result}");
            }
        }
        catch (Exception e)
        {
            mainPanel.ShowColorLog($"同步读取文件异常: {e.Message}", "red");
        }
    }

    public static void Tap_ReadFile()
    {
        string filePath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_async.txt");
        
        mainPanel.ShowLog($"正在读取文件(异步): {filePath}");
        
        ReadFileParam param = new ReadFileParam
        {
            filePath = filePath,
            encoding = "utf8",
            success = (res) =>
            {
                string content = res.stringData;
                mainPanel.ShowLog($"异步读取文件成功，内容: {content}");
            },
            fail = (res) =>
            {
                mainPanel.ShowColorLog($"异步读取文件失败: {res.errMsg}", "red");
            },
            complete = (res) =>
            {
                mainPanel.ShowLog("文件读取操作完成");
            }
        };
        
        Tap.GetFileSystemManager().ReadFile(param);
    }

    public static void Tap_UnlinkSync()
    {
        string filePath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_sync.txt");
        
        mainPanel.ShowLog($"正在删除文件: {filePath}");
        
        try
        {
            string result = Tap.GetFileSystemManager().UnlinkSync(filePath);
            
            // 检查返回结果是否包含错误码
            if (!FileSystemStats.CheckFileSystemError(result))
            {
                // 如果包含错误码，尝试解析错误码
                int errorCode = FileSystemStats.ParseErrorCode(result);
                if (errorCode != 0)
                {
                    // 获取错误描述并显示
                    string errorDescription = FileSystemStats.GetErrorDescription(errorCode);
                    mainPanel.ShowColorLog($"删除文件失败: 错误码 {errorCode}，{errorDescription}", "red");
                }
                else
                {
                    // 包含错误但无法解析具体错误码
                    mainPanel.ShowColorLog($"删除文件失败: {result}", "red");
                }
            }
            else
            {
                // 删除成功
                mainPanel.ShowLog($"删除文件成功: {result}");
            }
        }
        catch (Exception e)
        {
            mainPanel.ShowColorLog($"删除文件异常: {e.Message}", "red");
        }
    }

    public static void Tap_CopyFileSync()
    {
        string srcPath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_sync.txt");
        string destPath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_copy.txt");
        
        mainPanel.ShowLog($"正在复制文件: 从 {srcPath} 到 {destPath}");
        
        try
        {
            string result = Tap.GetFileSystemManager().CopyFileSync(srcPath, destPath);
            
            // 检查返回结果是否包含错误码
            if (!FileSystemStats.CheckFileSystemError(result))
            {
                // 如果包含错误码，尝试解析错误码
                int errorCode = FileSystemStats.ParseErrorCode(result);
                if (errorCode != 0)
                {
                    // 获取错误描述并显示
                    string errorDescription = FileSystemStats.GetErrorDescription(errorCode);
                    mainPanel.ShowColorLog($"复制文件失败: 错误码 {errorCode}，{errorDescription}", "red");
                }
                else
                {
                    // 包含错误但无法解析具体错误码
                    mainPanel.ShowColorLog($"复制文件失败: {result}", "red");
                }
            }
            else
            {
                // 复制成功
                mainPanel.ShowLog($"复制文件成功: {result}");
            }
        }
        catch (Exception e)
        {
            mainPanel.ShowColorLog($"复制文件异常: {e.Message}", "red");
        }
    }

    public static void Tap_MkdirSync()
    {
        string dirPath = System.IO.Path.Combine(Tap.env.USER_DATA_PATH, "test_dir");
        
        mainPanel.ShowLog($"正在创建目录: {dirPath}");
        
        try
        {
            string result = Tap.GetFileSystemManager().MkdirSync(dirPath, true);
            
            // 检查返回结果是否包含错误码
            if (!FileSystemStats.CheckFileSystemError(result))
            {
                // 如果包含错误码，尝试解析错误码
                int errorCode = FileSystemStats.ParseErrorCode(result);
                if (errorCode != 0)
                {
                    // 获取错误描述并显示
                    string errorDescription = FileSystemStats.GetErrorDescription(errorCode);
                    mainPanel.ShowColorLog($"创建目录失败: 错误码 {errorCode}，{errorDescription}", "red");
                }
                else
                {
                    // 包含错误但无法解析具体错误码
                    mainPanel.ShowColorLog($"创建目录失败: {result}", "red");
                }
            }
            else
            {
                // 创建成功
                mainPanel.ShowLog($"创建目录成功: {result}");
            }
        }
        catch (Exception e)
        {
            mainPanel.ShowColorLog($"创建目录异常: {e.Message}", "red");
        }
    }

    public static void Tap_ReaddirSync()
    {
        string dirPath = Tap.env.USER_DATA_PATH;
        
        mainPanel.ShowLog($"正在读取目录: {dirPath}");
        
        try
        {
            string[] files = Tap.GetFileSystemManager().ReaddirSync(dirPath);
            mainPanel.ShowLog($"读取目录成功，共有{files.Length}个文件/目录:");
            
            foreach (string file in files)
            {
                mainPanel.ShowLog($"- {file}");
            }
        }
        catch (Exception e)
        {
            mainPanel.ShowColorLog($"读取目录失败: {e.Message}", "red");
        }
    }

    #endregion

    #region 其他

    public static void Tap_DownloadFile()
    {
        DownloadFileOption option = new DownloadFileOption();
        option.url = "https://tap-android-dev-static.oss-cn-shanghai-internal.aliyuncs.com/custom/%E4%B8%8B%E8%BD%BD.png?Expires=1781185004&OSSAccessKeyId=LTAI5tJoa91rRQc2BVsrku7D&Signature=d%2FsHlaoFXtd2O4oqIkuJohAtQ%2BU%3D"; // 替换为实际的文件URL
        option.complete = (GeneralCallbackResult) =>
        {
            Debug.Log($"DownloadFile complete, errMsg: {GeneralCallbackResult.errMsg}");
        };
        option.success = (DownloadFileSuccessCallbackResult) =>
        {
            Debug.Log($"DownloadFile success, tempFilePath: {DownloadFileSuccessCallbackResult.tempFilePath}, statusCode: {DownloadFileSuccessCallbackResult.statusCode}");
        };
        option.fail = (GeneralCallbackResult) =>
        {
            Debug.Log($"DownloadFile fail, errMsg: {GeneralCallbackResult.errMsg}");
        };
        Tap.DownloadFile(option);
    }

    #endregion

    #region 设备相关测试

    // 获取电池信息（异步）
    public static void Tap_GetBatteryInfo()
    {
        mainPanel.ShowLog("正在获取电池信息(异步)...");
        
        GetBatteryInfoOption option = new GetBatteryInfoOption();
        option.success = (GetBatteryInfoSuccessCallbackResult result) =>
        {
            mainPanel.ShowLog($"电池信息获取成功：" +
                             $"\n电量：{result.level}%" +
                             $"\n是否充电中：{(result.isCharging ? "是" : "否")}");
        };
        option.fail = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"电池信息获取失败：{result.errMsg}", "red");
        };
        option.complete = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog("电池信息获取操作完成");
        };
        
        Tap.GetBatteryInfo(option);
    }

    // 获取电池信息（同步）
    public static void Tap_GetBatteryInfoSync()
    {
        mainPanel.ShowLog("正在获取电池信息(同步)...");
        
        try
        {
            GetBatteryInfoSyncResult result = Tap.GetBatteryInfoSync();
            mainPanel.ShowLog($"电池信息获取成功：" +
                             $"\n电量：{result.level}%" +
                             $"\n是否充电中：{(result.isCharging ? "是" : "否")}");
        }
        catch (Exception e)
        {
            mainPanel.ShowColorLog($"电池信息获取失败：{e.Message}", "red");
        }
    }

    // 获取网络类型
    public static void Tap_GetNetworkType()
    {
        mainPanel.ShowLog("正在获取网络类型...");
        
        GetNetworkTypeOption option = new GetNetworkTypeOption();
        option.success = (GetNetworkTypeSuccessCallbackResult result) =>
        {
            mainPanel.ShowLog($"网络类型获取成功：" +
                             $"\n网络类型：{result.networkType}" +
                             $"\n信号强度：{result.signalStrength}");
            
            // 根据网络类型判断是否有网络连接
            bool hasConnection = result.networkType != "none";
            mainPanel.ShowLog($"是否有网络连接：{(hasConnection ? "是" : "否")}");
        };
        option.fail = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"网络类型获取失败：{result.errMsg}", "red");
        };
        option.complete = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog("网络类型获取操作完成");
        };
        
        Tap.GetNetworkType(option);
    }

    // 监听网络状态变化
    private static bool isNetworkListening = false;
    public static void Tap_ToggleNetworkListener()
    {
        if (!isNetworkListening)
        {
            // 开始监听
            mainPanel.ShowLog("开始监听网络状态变化...");
            
            Tap.OnNetworkStatusChange((OnNetworkStatusChangeListenerResult result) =>
            {
                // 根据网络类型判断是否有网络连接
                bool hasConnection = result.networkType != "none";
                
                mainPanel.ShowLog($"[网络状态变化] " +
                                 $"类型：{result.networkType}, " +
                                 $"是否可用：{(hasConnection ? "是" : "否")}" );
            });
            
            isNetworkListening = true;
            mainPanel.ShowLog("网络状态监听已启动");
        }
        else
        {
            // 停止监听
            mainPanel.ShowLog("停止监听网络状态变化...");
            Tap.OffNetworkStatusChange((result) => { });
            isNetworkListening = false;
            mainPanel.ShowLog("网络状态监听已停止");
        }
    }

    // 获取屏幕亮度
    public static void Tap_GetScreenBrightness()
    {
        mainPanel.ShowLog("正在获取屏幕亮度...");
        
        GetScreenBrightnessOption option = new GetScreenBrightnessOption();
        option.success = (GetScreenBrightnessSuccessCallbackOption result) =>
        {
            mainPanel.ShowLog($"屏幕亮度获取成功：{result.value} (范围0-1)");
        };
        option.fail = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"屏幕亮度获取失败：{result.errMsg}", "red");
        };
        option.complete = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog("屏幕亮度获取操作完成");
        };
        
        Tap.GetScreenBrightness(option);
    }

    // 设置屏幕亮度
    public static void Tap_SetScreenBrightness()
    {
        float brightness = 0.7f; // 设置为70%亮度
        mainPanel.ShowLog($"正在设置屏幕亮度为 {brightness * 100}%...");
        
        SetScreenBrightnessOption option = new SetScreenBrightnessOption();
        option.value = brightness;
        option.success = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog($"屏幕亮度设置成功：{brightness * 100}%");
        };
        option.fail = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"屏幕亮度设置失败：{result.errMsg}", "red");
        };
        option.complete = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog("屏幕亮度设置操作完成");
        };
        
        Tap.SetScreenBrightness(option);
    }

    // 设置是否保持屏幕常亮
    private static bool isKeepScreenOn = false;
    public static void Tap_ToggleKeepScreenOn()
    {
        isKeepScreenOn = !isKeepScreenOn;
        mainPanel.ShowLog($"正在{(isKeepScreenOn ? "开启" : "关闭")}屏幕常亮...");
        
        SetKeepScreenOnOption option = new SetKeepScreenOnOption();
        option.keepScreenOn = isKeepScreenOn;
        option.success = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog($"屏幕常亮已{(isKeepScreenOn ? "开启" : "关闭")}");
        };
        option.fail = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"设置屏幕常亮失败：{result.errMsg}", "red");
        };
        option.complete = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog("设置屏幕常亮操作完成");
        };
        
        Tap.SetKeepScreenOn(option);
    }

    // 监听加速度数据
    private static bool isAccelerometerListening = false;
    public static void Tap_ToggleAccelerometerListener()
    {
        if (!isAccelerometerListening)
        {
            // 开始监听
            mainPanel.ShowLog("开始监听加速度数据...");
            
            Tap.OnAccelerometerChange((OnAccelerometerChangeListenerResult result) =>
            {
                mainPanel.ShowLog($"[加速度数据] X: {result.x:F2}, Y: {result.y:F2}, Z: {result.z:F2}");
            });
            
            isAccelerometerListening = true;
            mainPanel.ShowLog("加速度数据监听已启动");
        }
        else
        {
            // 停止监听
            mainPanel.ShowLog("停止监听加速度数据...");
            Tap.OffAccelerometerChange((result) => { });
            isAccelerometerListening = false;
            mainPanel.ShowLog("加速度数据监听已停止");
        }
    }

    // 设置剪贴板内容
    public static void Tap_SetClipboardData()
    {
        string clipboardContent = "这是通过TapSDK设置的剪贴板内容 - " + DateTime.Now.ToString();
        mainPanel.ShowLog($"正在设置剪贴板内容...");
        
        SetClipboardDataOption option = new SetClipboardDataOption();
        option.data = clipboardContent;
        option.success = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog($"剪贴板内容设置成功：\n{clipboardContent}");
        };
        option.fail = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"剪贴板内容设置失败：{result.errMsg}", "red");
        };
        option.complete = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog("剪贴板内容设置操作完成");
        };
        
        Tap.SetClipboardData(option);
    }

    // 获取剪贴板内容
    public static void Tap_GetClipboardData()
    {
        mainPanel.ShowLog("正在获取剪贴板内容...");
        
        GetClipboardDataOption option = new GetClipboardDataOption();
        option.success = (GetClipboardDataSuccessCallbackOption result) =>
        {
            mainPanel.ShowLog($"剪贴板内容获取成功：\n{result.data}");
        };
        option.fail = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowColorLog($"剪贴板内容获取失败：{result.errMsg}", "red");
        };
        option.complete = (GeneralCallbackResult result) =>
        {
            mainPanel.ShowLog("剪贴板内容获取操作完成");
        };
        
        Tap.GetClipboardData(option);
    }

    // 长震动测试
    public static void Tap_VibrateLong()
    {
        mainPanel.ShowLog("触发长震动...");

        VibrateLongOption option = new VibrateLongOption();
        option.complete = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"长震动完成: {GeneralCallbackResult.errMsg}");
        };
        option.success = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"长震动成功: {GeneralCallbackResult.errMsg}");
        };
        option.fail = (GeneralCallbackResult) =>
        {
            mainPanel.ShowColorLog($"长震动失败: {GeneralCallbackResult.errMsg}", "red");
        };

        Tap.VibrateLong(option);
    }

    // 短震动测试
    public static void Tap_VibrateShort()
    {
        mainPanel.ShowLog("触发短震动...");
        
        VibrateShortOption option = new VibrateShortOption();
        option.complete = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"短震动完成: {GeneralCallbackResult.errMsg}");
        };
        option.success = (GeneralCallbackResult) =>
        {
            mainPanel.ShowLog($"短震动成功: {GeneralCallbackResult.errMsg}");
        };
        option.fail = (GeneralCallbackResult) =>
        {
            mainPanel.ShowColorLog($"短震动失败: {GeneralCallbackResult.errMsg}", "red");
        };
        
        Tap.VibrateShort(option);
    }

    // 定位测试
    public static void Tap_GetFuzzyLocation()
    {
        mainPanel.ShowLog("测试获取位置");

        try
        {
            // 配置获取模糊位置的参数
            var option = new GetFuzzyLocationOption
            {
                success = (res) =>
                {
                    mainPanel.ShowLog($"获取位置成功: 经度={res.longitude}, 纬度={res.latitude}");
                },
                fail = (res) =>
                {
                    mainPanel.ShowLog($"获取位置失败: {res.errMsg}");
                },
                complete = (res) =>
                {
                    mainPanel.ShowLog($"获取位置操作完成: {res.errMsg}");
                }
            };

            // 调用模糊定位API
            Tap.GetFuzzyLocation(option);
        }
        catch (Exception e)
        {
            mainPanel.ShowLog($"获取位置出错: {e.Message}");
        }
    }

    // 扫码测试 
    public static void Tap_ScanCode()
    {
        mainPanel.ShowLog("测试扫描二维码");
        
        try
        {
            // 配置扫码参数
            var option = new ScanCodeOption
            {
                scanType = new string[] { "qrCode", "barCode" }, // 可以同时支持多种码
                success = (res) => {
                    mainPanel.ShowLog($"扫码成功: result={res.result}, scanType={res.scanType}, charSet={res.charSet}, path={res.path}");
                },
                fail = (res) => {
                    mainPanel.ShowLog($"扫码失败: {res.errMsg}");
                },
                complete = (res) => {
                    mainPanel.ShowLog($"扫码操作完成 : {res.errMsg}");
                }
            };
            
            // 调用扫码API
            Tap.ScanCode(option);
        }
        catch (Exception e)
        {
            mainPanel.ShowLog($"扫码出错: {e.Message}");
        }
    }

    #endregion

    #region 支付相关

    // 检查当前是否为Android平台（用于支付相关功能）
    private static bool _isAndroidPlatformChecked = false;
    private static bool _isAndroidPlatform = false;

    public static void CheckAndroidPlatform(Action<bool> callback)
    {
        // 如果已经检查过平台，直接返回结果
        if (_isAndroidPlatformChecked)
        {
            callback?.Invoke(_isAndroidPlatform);
            return;
        }
        
        // 使用GetSystemInfo获取平台信息
        GetSystemInfoOption option = new GetSystemInfoOption();
        option.success = (result) => 
        {
            _isAndroidPlatformChecked = true;
            _isAndroidPlatform = result.platform == "android";
            callback?.Invoke(_isAndroidPlatform);
        };
        
        option.fail = (result) =>
        {
            mainPanel.ShowColorLog($"获取平台信息失败: {result.errMsg}", "red");
            callback?.Invoke(false); // 失败时假设不是Android平台
        };
        
        Tap.GetSystemInfo(option);
    }

    // 请求游戏内道具支付
    public static void Tap_RequestMidasPaymentGameItem()
    {
        // 在开始前检查平台
        CheckAndroidPlatform((isAndroid) => {
            if (!isAndroid)
            {
                mainPanel.ShowColorLog("支付功能仅在Android平台可用，当前平台不支持支付", "red");
                return;
            }
            
            // 继续执行原有的支付逻辑
            mainPanel.ShowLog("正在准备支付请求...");
            
            // 构建支付数据
            string signData = "{\"mode\":\"goods\",\"offerId\":\"123\",\"buyQuantity\":1,\"env\":0,\"currencyType\":\"CNY\",\"platform\":\"android\",\"zoneId\":\"1\",\"productId\":\"testproductId\",\"goodsPrice\":10,\"outTradeNo\":\"" + DateTime.Now.Ticks + "\",\"attach\":\"testdata\"}";
            
            // 计算签名 (在实际应用中，这个签名应该由服务器生成并下发给客户端)
            string method = "requestMidasPaymentGameItem";
            string appkey = "demoAppKey123456"; // 仅作演示，实际开发中应使用后端生成的签名
            string paySig = GeneratePaySignature(signData, appkey, method);
            
            mainPanel.ShowLog($"支付数据准备完成:\n签名数据: {signData}\n支付签名: {paySig}");
            
            // 创建支付请求
            RequestMidasPaymentGameItemOption option = new RequestMidasPaymentGameItemOption();
            option.signData = signData;
            option.paySig = paySig;     // 支付签名
            option.signature = paySig;  // 根据示例，signature和paySig值相同
            
            // 成功回调 - 使用正确的回调类型
            option.success = (result) =>
            {
                // 根据SDK使用正确的属性
                mainPanel.ShowLog($"支付成功: {result.errMsg}");
                
                // 输出其他可能的属性
                try {
                    var properties = result.GetType().GetProperties();
                    foreach (var prop in properties) {
                        var value = prop.GetValue(result, null);
                        if (value != null) {
                            mainPanel.ShowLog($"- {prop.Name}: {value}");
                        }
                    }
                } catch (Exception) {
                    // 忽略反射异常
                }
            };
            
            // 失败回调 - 使用正确的回调类型
            option.fail = (MidasPaymentGameItemError error) =>
            {
                mainPanel.ShowColorLog($"支付失败: {error.errMsg}, 错误码: {error.errCode}", "red");
            };
            
            // 完成回调
            option.complete = (MidasPaymentGameItemError result) =>
            {
                mainPanel.ShowLog($"支付流程完成");
            };
            
            // 发起支付请求
            try
            {
                Tap.RequestMidasPaymentGameItem(option);
                mainPanel.ShowLog("支付请求已发送，等待处理...");
            }
            catch (Exception e)
            {
                mainPanel.ShowColorLog($"发起支付请求时出错: {e.Message}", "red");
            }
        });
    }

    // 生成支付签名
    private static string GeneratePaySignature(string signData, string appkey, string method)
    {
        try
        {
            // 按照提供的Python示例实现HMAC-SHA256签名
            string needEncodeBody = method + "&" + signData;
            byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(appkey);
            byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(needEncodeBody);
            
            using (var hmac = new System.Security.Cryptography.HMACSHA256(keyBytes))
            {
                byte[] hashBytes = hmac.ComputeHash(messageBytes);
                return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
            }
        }
        catch (Exception e)
        {
            mainPanel.ShowColorLog($"生成签名时出错: {e.Message}", "red");
            return "dummySignature123456"; // 出错时返回一个假签名，仅用于演示
        }
    }

    #endregion
    
    #region 宿主平台判断

    // 获取当前运行平台类型
    public static void Tap_CheckPlatform()
    {
        // 使用GetSystemInfo获取平台信息
        GetSystemInfoOption option = new GetSystemInfoOption();
        option.success = (result) => 
        {
            string platform = result.platform;
            string system = result.system;
            
            mainPanel.ShowLog($"当前运行平台: {platform}");
            
            // 根据platform值确定具体平台
            if (platform == "ios")
            {
                mainPanel.ShowLog("检测到iOS平台");
                mainPanel.ShowLog($"系统版本: {system}");
            }
            else if (platform == "android")
            {
                mainPanel.ShowLog("检测到Android平台");
                mainPanel.ShowLog($"系统版本: {system}");
            }
            else if (platform == "devtools")
            {
                mainPanel.ShowLog("检测到开发者工具环境");
            }
            else
            {
                mainPanel.ShowLog($"其他平台: {platform}");
            }
            
            // 显示其他系统信息
            mainPanel.ShowLog($"系统语言: {result.language}");
            mainPanel.ShowLog($"系统版本: {result.system}");
            mainPanel.ShowLog($"屏幕尺寸: {result.windowWidth}x{result.windowHeight}");
        };
        
        option.fail = (result) =>
        {
            mainPanel.ShowColorLog($"获取平台信息失败: {result.errMsg}", "red");
        };
        
        mainPanel.ShowLog("正在获取平台信息...");
        Tap.GetSystemInfo(option);
    }

    #endregion

    #region 更新管理器测试

    public static void Tap_GetUpdateManager()
    {
        mainPanel.ShowLog("测试获取更新管理器");
        
        try
        {
            // 获取更新管理器
            var updateManager = Tap.GetUpdateManager();
            mainPanel.ShowLog("更新管理器获取成功");
            
            // 检查更新
            updateManager.OnCheckForUpdate((res) => {
                mainPanel.ShowLog($"检查更新结果: hasUpdate={res.hasUpdate}");
                
                if (res.hasUpdate)
                {
                    // 监听更新下载
                    updateManager.OnUpdateReady((errorMsg) => {
                        mainPanel.ShowLog($"更新完成 {errorMsg}");
                        
                        // 使用 TapTap 小游戏的模态对话框询问用户
                        ShowModalOption modalOption = new ShowModalOption();
                        modalOption.title = "更新";
                        modalOption.content = "新版本已准备好，是否立即应用更新？";
                        modalOption.showCancel = true;
                        modalOption.confirmText = "确定";
                        modalOption.cancelText = "取消";
                        modalOption.success = (result) => {
                            if (result.confirm)
                            {
                                updateManager.ApplyUpdate();
                                mainPanel.ShowLog("用户确认应用更新");
                            }
                            else
                            {
                                mainPanel.ShowLog("用户取消应用更新");
                            }
                        };
                        modalOption.fail = (result) => {
                            mainPanel.ShowLog($"显示更新对话框失败: {result.errMsg}");
                        };
                        
                        Tap.ShowModal(modalOption);
                    });
                }
            });
        }
        catch (Exception e)
        {
            mainPanel.ShowLog($"获取更新管理器失败: {e.Message}");
        }
    }

    #endregion

}
