using System.Collections;
using System.Collections.Generic;
using TapTapMiniGame;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class MainPanel : MonoBehaviour
{
    // 左侧区域
    [SerializeField] private RectTransform _menuContainer;
    [SerializeField] private Toggle _baseMenu; // 基础菜单选项卡
    
    [SerializeField] private RectTransform _btnContainer;
    [SerializeField] private Button _baseBtn;
    
    // 右侧区域
    [SerializeField] private RectTransform _logContent;
    [SerializeField] private Text _logText;
    
    [SerializeField] private Button _clearBtn;
    [SerializeField] private Button _copyBtn;

    // 菜单分类和管理
    private List<Toggle> _menuToggles = new List<Toggle>();
    private Dictionary<string, List<Button>> _categoryButtons = new Dictionary<string, List<Button>>();
    private string _currentCategory;
    
    void Start()
    {
        // 设置静态引用，使TapMiniGameDemo可以访问到MainPanel
        TapMiniGameDemo.mainPanel = this;
        
        _baseMenu.gameObject.SetActive(false);
        _baseBtn.gameObject.SetActive(false);
        
        // 确保富文本支持已启用
        if (_logText != null)
        {
            _logText.supportRichText = true;
        }
        
        // 初始化日志区域
        _logText.text = "日志输出区域...";
        UpdateLogContentSize();
        
        // 设置清空按钮点击事件
        if (_clearBtn != null)
        {
            _clearBtn.onClick.AddListener(ClearLog);
        }
        
        // 在 Start 方法中，找到 _clearBtn 初始化的部分，在其后添加这段代码
        if (_copyBtn != null)
        {
            _copyBtn.onClick.AddListener(CopyLogToClipboard);
        }
        
        // 测试用例：创建菜单分类
        List<string> categories = new List<string> { "基础", "界面", "支付", "缓存/文件", "其他" };
        CreateMenuCategories(categories);
        
        // 测试用例：为每个分类添加测试按钮
        AddBasicCategoryButtons();
        AddUICategoryButtons();
        AddPaymentCategoryButtons();
        AddCacheCategoryButtons();
        AddAdsCategoryButtons();
        AddOhterCategoryButtons();
        
        // 初始日志
        ShowLog("测试界面初始化完成");
    }
    
    /// <summary>
    /// 创建菜单类别
    /// </summary>
    /// <param name="categories">功能模块分类列表</param>
    public void CreateMenuCategories(List<string> categories)
    {
        if (categories == null || categories.Count == 0) return;
        
        // 清理现有菜单
        ClearMenus();
        
        // 为每个类别创建菜单项
        for (int i = 0; i < categories.Count; i++)
        {
            string category = categories[i];
            
            // 实例化菜单项
            Toggle menuToggle = Instantiate(_baseMenu, _menuContainer);
            menuToggle.gameObject.SetActive(true);
            menuToggle.transform.SetSiblingIndex(i);
            
            // 设置菜单文本
            Text menuText = menuToggle.GetComponentInChildren<Text>();
            if (menuText != null) menuText.text = category;
            
            // 添加到管理列表
            _menuToggles.Add(menuToggle);
            
            // 如果此类别下没有按钮列表，则创建一个
            if (!_categoryButtons.ContainsKey(category))
            {
                _categoryButtons[category] = new List<Button>();
            }
            
            // 设置切换事件
            string categoryName = category; // 创建本地副本来避免闭包问题
            menuToggle.onValueChanged.AddListener((isOn) =>
            {
                if (isOn)
                {
                    _currentCategory = categoryName;
                    ShowCategoryButtons(categoryName);
                }
            });
            
            // 默认选中第一个菜单
            if (i == 0)
            {
                _currentCategory = category;
                // 不要在循环中设置isOn，因为可能触发回调改变当前类别
            }
        }
        
        // 在所有菜单和按钮都准备好后，选中第一个菜单并显示对应按钮
        if (_menuToggles.Count > 0)
        {
            // 首先确保所有菜单都是未选中状态
            foreach (Toggle toggle in _menuToggles)
            {
                toggle.isOn = false;
            }
            
            // 然后选中第一个菜单，这将触发onValueChanged事件
            _menuToggles[0].isOn = true;
            
            // 以防onValueChanged没有触发，强制显示第一个类别的按钮
            if (_menuToggles.Count > 0 && categories.Count > 0)
            {
                ShowCategoryButtons(categories[0]);
            }
        }
    }
    
    /// <summary>
    /// 为当前类别添加测试按钮
    /// </summary>
    /// <param name="category">类别名称</param>
    /// <param name="buttonName">按钮名称</param>
    /// <param name="onClick">点击事件处理</param>
    public void AddButton(string category, string buttonName, System.Action onClick)
    {
        if (string.IsNullOrEmpty(category) || !_categoryButtons.ContainsKey(category)) return;
        
        // 创建新按钮
        Button newBtn = Instantiate(_baseBtn, _btnContainer);
        newBtn.gameObject.SetActive(_currentCategory == category);
        
        // 设置按钮文本
        Text btnText = newBtn.GetComponentInChildren<Text>();
        if (btnText != null) btnText.text = buttonName;
        
        // 设置点击事件
        newBtn.onClick.AddListener(() => 
        {
            onClick?.Invoke();
        });
        
        // 添加到对应类别的按钮列表
        _categoryButtons[category].Add(newBtn);
    }
    
    /// <summary>
    /// 显示指定类别的按钮
    /// </summary>
    /// <param name="category">类别名称</param>
    private void ShowCategoryButtons(string category)
    {
        if (!_categoryButtons.ContainsKey(category)) return;
        
        // 隐藏所有按钮
        foreach (var kvp in _categoryButtons)
        {
            foreach (Button btn in kvp.Value)
            {
                btn.gameObject.SetActive(false);
            }
        }
        
        // 显示当前类别的按钮
        foreach (Button btn in _categoryButtons[category])
        {
            btn.gameObject.SetActive(true);
        }
        
        ShowLog($"已切换到 {category} 模块");
    }
    
    /// <summary>
    /// 清理所有菜单和按钮
    /// </summary>
    private void ClearMenus()
    {
        // 销毁现有菜单
        foreach (Toggle toggle in _menuToggles)
        {
            if (toggle != null && toggle != _baseMenu)
            {
                Destroy(toggle.gameObject);
            }
        }
        _menuToggles.Clear();
        
        // 销毁现有按钮
        foreach (var kvp in _categoryButtons)
        {
            foreach (Button btn in kvp.Value)
            {
                if (btn != null && btn != _baseBtn)
                {
                    Destroy(btn.gameObject);
                }
            }
        }
        _categoryButtons.Clear();
    }
    
    /// <summary>
    /// 显示日志信息
    /// </summary>
    /// <param name="message">日志消息</param>
    public void ShowLog(string message)
    {
        if (_logText != null)
        {
            string timeStamp = System.DateTime.Now.ToString("\n[HH:mm:ss] ");

            // 添加日志到现有内容，使用换行符分隔
            _logText.text += "\n" + message+ timeStamp;
            
            // 更新内容区域大小
            UpdateLogContentSize();
        }
    }
    
    /// <summary>
    /// 显示带颜色的日志信息
    /// </summary>
    /// <param name="message">日志消息</param>
    /// <param name="color">颜色: red, green, blue, yellow等</param>
    public void ShowColorLog(string message, string color)
    {
        if (_logText != null)
        {
            // 使用富文本标签添加颜色
            string coloredMessage = $"<color={color}>{message}</color>";
            
            // 添加时间戳（如果需要）
            string timeStamp = System.DateTime.Now.ToString("\n[HH:mm:ss] ");
            
            _logText.text += "\n" + coloredMessage + timeStamp;
            
            // 输出到控制台方便调试
            Debug.Log($"{coloredMessage}");
            
            // 更新内容区域大小
            UpdateLogContentSize();
        }
    }
    
    /// <summary>
    /// 清除日志
    /// </summary>
    public void ClearLog()
    {
        if (_logText != null)
        {
            _logText.text = "日志已清空...";
            UpdateLogContentSize();
        }
    }
    
    /// <summary>
    /// 更新日志内容区域大小
    /// </summary>
    private void UpdateLogContentSize()
    {
        if (_logContent != null && _logText != null)
        {
            // 确保日志内容容器的高度与文本高度一致
            Canvas.ForceUpdateCanvases();
            Vector2 textSize = new Vector2(_logText.preferredWidth, _logText.preferredHeight);
            _logContent.sizeDelta = new Vector2(_logContent.sizeDelta.x, Mathf.Max(textSize.y, _logContent.parent.GetComponent<RectTransform>().rect.height));
            
            // 将滚动视图滚动到底部
            ScrollRect scrollRect = _logContent.GetComponentInParent<ScrollRect>();
            if (scrollRect != null)
            {
                scrollRect.verticalNormalizedPosition = 0;
            }
        }
    }

    // 添加各个分类的按钮
    private void AddBasicCategoryButtons()
    {
        AddButton("基础", "初始化SDK", () => { 
            TapMiniGameDemo.Tap_InitSDK(); 
        });
        
        AddButton("基础", "登录", () => { 
            TapMiniGameDemo.Tap_Login(); 
        });
        
        AddButton("基础", "检查会话", () => { 
            TapMiniGameDemo.Tap_CheckSession(); 
        });
        
        AddButton("基础", "请求授权", () => { 
            TapMiniGameDemo.Tap_Authorize(); 
        });
        
        AddButton("基础", "获取用户信息", () => { 
            TapMiniGameDemo.Tap_GetUserInfo(); 
        });
        
        AddButton("基础", "隐私协议", () => { 
            TapMiniGameDemo.Tap_OpenPrivacyContract(); 
        });
        
        AddButton("基础", "系统信息", () => { 
            TapMiniGameDemo.Tap_GetSystemInfo(); 
        });
        
        AddButton("基础", "设备信息", () => { 
            TapMiniGameDemo.Tap_GetDeviceInfo(); 
        });
    }

    private void AddUICategoryButtons()
    {
        AddButton("界面", "显示提示", () => { 
            TapMiniGameDemo.Tap_ShowToast(); 
        });
        
        AddButton("界面", "显示加载", () => { 
            TapMiniGameDemo.Tap_ShowLoading(); 
        });
        
        AddButton("界面", "显示对话框", () => { 
            TapMiniGameDemo.Tap_ShowModal(); 
        });
        
        AddButton("界面", "分享", () => { 
            TapMiniGameDemo.Tap_Shared(); 
        });
        
        AddButton("界面", "启用调试", () => { 
            TapMiniGameDemo.Tap_SetEnableDebug(); 
        });
    }

    private void AddPaymentCategoryButtons()
    {
        AddButton("支付", "游戏内道具支付", () => {
            TapMiniGameDemo.Tap_RequestMidasPaymentGameItem();
        });
        
    }

    private void AddCacheCategoryButtons()
    {
        AddButton("缓存/文件", "写入文件(同步", () => {
            TapMiniGameDemo.Tap_WriteFileSync();
        });
        
        AddButton("缓存/文件", "写入文件(异步)", () => {
            TapMiniGameDemo.Tap_WriteFile();
        });
        
        AddButton("缓存/文件", "读取文件(同步)", () => {
            TapMiniGameDemo.Tap_ReadFileSync();
        });
        
        AddButton("缓存/文件", "读取文件(异步)", () => {
            TapMiniGameDemo.Tap_ReadFile();
        });
        
        AddButton("缓存/文件", "删除文件", () => {
            TapMiniGameDemo.Tap_UnlinkSync();
        });
        
        AddButton("缓存/文件", "复制文件", () => {
            TapMiniGameDemo.Tap_CopyFileSync();
        });
        
        AddButton("缓存/文件", "创建目录", () => {
            TapMiniGameDemo.Tap_MkdirSync();
        });
        
        AddButton("缓存/文件", "读取目录", () => {
            TapMiniGameDemo.Tap_ReaddirSync();
        });
    }

    private void AddAdsCategoryButtons()
    {

    }

    private void AddOhterCategoryButtons()
    {
        // 已有的按钮
        AddButton("其他", "长震动", () =>
        {
            TapMiniGameDemo.Tap_VibrateLong();
        });

        AddButton("其他", "短震动", () =>
        {
            TapMiniGameDemo.Tap_VibrateShort();
        });

        AddButton("其他", "下载文件", () =>
        {
            TapMiniGameDemo.Tap_DownloadFile();
        });

        // 电池相关
        AddButton("其他", "获取电池信息-异步", () =>
        {
            TapMiniGameDemo.Tap_GetBatteryInfo();
        });

        AddButton("其他", "获取电池信息-同步", () =>
        {
            TapMiniGameDemo.Tap_GetBatteryInfoSync();
        });

        // 网络相关
        AddButton("其他", "获取网络类型", () =>
        {
            TapMiniGameDemo.Tap_GetNetworkType();
        });

        AddButton("其他", "切换网络监听", () =>
        {
            TapMiniGameDemo.Tap_ToggleNetworkListener();
        });

        // 屏幕相关
        AddButton("其他", "获取屏幕亮度", () =>
        {
            TapMiniGameDemo.Tap_GetScreenBrightness();
        });

        AddButton("其他", "设置屏幕亮度", () =>
        {
            TapMiniGameDemo.Tap_SetScreenBrightness();
        });

        AddButton("其他", "切换屏幕常亮", () =>
        {
            TapMiniGameDemo.Tap_ToggleKeepScreenOn();
        });

        // 传感器相关
        AddButton("其他", "切换加速度监听", () =>
        {
            TapMiniGameDemo.Tap_ToggleAccelerometerListener();
        });

        // 剪贴板相关
        AddButton("其他", "设置剪贴板内容", () =>
        {
            TapMiniGameDemo.Tap_SetClipboardData();
        });

        AddButton("其他", "获取剪贴板内容", () =>
        {
            TapMiniGameDemo.Tap_GetClipboardData();
        });

        // 添加平台检测按钮
        AddButton("其他", "检测运行平台", () =>
        {
            TapMiniGameDemo.Tap_CheckPlatform();
        });
        
        // 运行所有测试
        AddTestButtons();
    }

    private void AddTestButtons()
    {
        // 使用反射查找 TestAll 类型
        System.Type testAllType = null;
        foreach (var assembly in System.AppDomain.CurrentDomain.GetAssemblies())
        {
            testAllType = assembly.GetType("TestAll");
            if (testAllType != null) break;
        }

        // 如果找到 TestAll 类型，添加测试按钮
        if (testAllType != null)
        {
            AddButton("其他", "运行所有测试", () => {
                ShowLog("正在启动所有Tap SDK接口测试...");
                
                // 查找现有的TestAll实例
                var existingTest = GameObject.FindObjectOfType(testAllType) as MonoBehaviour;
                
                // 如果已存在实例，先销毁它
                if (existingTest != null)
                {
                    GameObject.Destroy(existingTest.gameObject);
                    ShowLog("清理现有测试实例...");
                }
                
                // 创建新的测试对象
                GameObject testObj = new GameObject("TapSDK_TestRunner");
                var testAll = testObj.AddComponent(testAllType) as MonoBehaviour;
                
                // 通过反射设置 mainPanel
                testAllType.GetField("mainPanel").SetValue(testAll, this);
                
                ShowLog("测试初始化完成，开始执行...");
            });
        }
    }

    // 辅助协程
    private IEnumerator DelayedLog(string message, float delay)
    {
        yield return new WaitForSeconds(delay);
        ShowLog(message);
    }

    private IEnumerator SimulateDownload()
    {
        for (int i = 0; i <= 10; i++)
        {
            ShowLog($"下载进度: {i * 10}%");
            yield return new WaitForSeconds(0.3f);
        }
        ShowLog("下载完成!");
    }

    private IEnumerator PerformanceTest()
    {
        ShowLog("测试CPU使用率...");
        yield return new WaitForSeconds(0.5f);
        ShowLog($"CPU: {Random.Range(5, 30)}%");
        
        ShowLog("测试内存使用情况...");
        yield return new WaitForSeconds(0.5f);
        ShowLog($"内存: {Random.Range(100, 500)}MB");
        
        ShowLog("测试帧率...");
        yield return new WaitForSeconds(0.5f);
        ShowLog($"帧率: {Random.Range(30, 60)} FPS");
        
        ShowLog("性能测试完成");
    }

    // 在某个初始化方法中添加测试
    public void TestColorText()
    {
        ShowLog("正常文本");
        ShowColorLog("这是红色文本测试", "red");
        ShowColorLog("这是绿色文本测试", "green");
        ShowColorLog("这是蓝色文本测试", "blue");
    }

    /// <summary>
    /// 复制日志内容到剪贴板
    /// </summary>
    public void CopyLogToClipboard()
    {
        if (_logText != null && !string.IsNullOrEmpty(_logText.text))
        {
            SetClipboardDataOption option = new SetClipboardDataOption();
            option.data = _logText.text;
            option.success = (result) =>
            {
                ShowColorLog("已成功复制日志内容到剪贴板", "green");
            };
            option.fail = (result) =>
            {
                ShowColorLog($"复制到剪贴板失败: {result.errMsg}", "red");
            };
            option.complete = (result) =>
            {
                ShowLog("剪贴板操作完成");
            };
            
            Tap.SetClipboardData(option);
        }
        else
        {
            ShowColorLog("没有可复制的日志内容", "yellow");
        }
    }
}
