#include <iostream>
#include <chrono>
#include <thread>
#include <string>

// 延迟状态管理器（单例模式，模拟全局延迟控制）
class LagEffectManager {
private:
    static LagEffectManager* instance;
    int currentLagMs;  // 当前延迟毫秒数（0-1000）
    bool isLagActive;  // 是否启用延迟特效
    LagEffectManager() : currentLagMs(0), isLagActive(false) {}

public:
    static LagEffectManager* GetInstance() {
        if (!instance) instance = new LagEffectManager();
        return instance;
    }

    // 设置延迟数值（模拟网络波动）
    void SetLagMs(int lagMs) {
        currentLagMs = std::max(0, std::min(1000, lagMs));  // 限制在0-1000ms
        isLagActive = currentLagMs > 50;  // 延迟>50ms时触发特效
    }

    // 获取当前延迟
    int GetCurrentLagMs() const { return currentLagMs; }

    // 检查是否需要启用特效
    bool IsLagActive() const { return isLagActive; }

    // 延迟特效核心逻辑（每帧调用）
    void UpdateLagEffect() {
        if (!isLagActive) return;

        // 1. 绘制延迟UI（模拟和平精英右上角延迟数值）
        DrawLagUI();

        // 2. 模拟帧延迟（根据延迟毫秒数阻塞线程，还原卡顿感）
        std::this_thread::sleep_for(std::chrono::milliseconds(currentLagMs / 2));
    }

private:
    // 绘制延迟UI（文字跳动+颜色预警）
    void DrawLagUI() {
        std::string colorCode;
        // 模拟和平精英延迟颜色逻辑：绿色(0-100)→黄色(101-300)→红色(>300)
        if (currentLagMs <= 100) colorCode = "\033[32m";  // 绿色
        else if (currentLagMs <= 300) colorCode = "\033[33m";  // 黄色
        else colorCode = "\033[31m";  // 红色

        // 输出带颜色的延迟数值（模拟UI跳动，每帧刷新）
        std::cout << "\r" << colorCode << "[网络延迟] " << currentLagMs << "ms \033[0m" << std::flush;
    }
};

// 初始化单例实例
LagEffectManager* LagEffectManager::instance = nullptr;

// 模拟游戏主循环（每帧调用延迟特效）
void GameMainLoop() {
    auto lagManager = LagEffectManager::GetInstance();
    int frameCount = 0;

    while (true) {
        // 模拟网络波动：每10帧随机更新一次延迟（0-800ms）
        if (frameCount % 10 == 0) {
            int randomLag = rand() % 801;  // 0-800ms随机延迟
            lagManager->SetLagMs(randomLag);
        }

        // 1. 执行游戏其他逻辑（移动、渲染等，此处省略）
        std::cout << "\r游戏帧更新... " << std::flush;

        // 2. 执行延迟特效（核心调用）
        lagManager->UpdateLagEffect();

        // 3. 模拟正常帧间隔（16ms≈60帧）
        std::this_thread::sleep_for(std::chrono::milliseconds(16));
        frameCount++;
    }
}

int main() {
    // 启动游戏主循环
    GameMainLoop();
    return 0;
}
