// Silent.h

#pragma once
#include <memory>
#include <cstdint>
#include <vector>
#include <atomic>   // ДОБАВЛЕНО
#include <mutex>    // ДОБАВЛЕНО
#include <Globals.hxx> 
#include "Engine/Engine.h"
#include "Core/Features/Cache/Cache.h"

namespace Silent
{
    void SilentFramePos();
    void SilentMouse();
    void RunService();
}

// --- Переменные состояния Silent Aim ---

// FIX: Мьютекс для защиты данных, к которым обращаются оба потока
inline std::mutex SilentDataMutex;

// FIX: Флаг готовности должен быть атомарным для безопасного доступа без блокировки
inline std::atomic<bool> IsSilentReady{ false };

// FIX: Цель должна быть типа CachedPlayer, как в твоем Player_Cache
inline Globals::CachedPlayer SilentCachedTarget{};

// FIX: Эта переменная используется только в потоке SilentMouse, но мы будем получать ее через блокировку
inline SDK::Vector2 SilentPartPos{};

// Управление состоянием клавиш (используется только в SilentFramePos)
inline bool SilentAimLocked{ false };
inline bool SilentAimKeyWasPressed{ false };

// Управление GUI "Aim" (используется только в SilentFramePos)
inline SDK::Instance SilentAimInstance{};
inline bool SilentHasOriginalSizes{ false };
inline SDK::Vector2 SilentOriginalSize{};
inline std::vector<std::pair<std::uint64_t, SDK::Vector2>> SilentOriginalChildrenSizes{};

// Глобальный указатель на сервис мыши
inline std::unique_ptr<SDK::Instance> MouseService{};


// Ненужные/дублирующиеся переменные. Рекомендую их удалить, чтобы не было путаницы.
// inline bool SilentTarget{ false };
// inline bool TargetNeedsReset{ false };
// inline std::uint64_t SilentCachedPositionX{ 0 };
// inline std::uint64_t SilentCachedPositionY{ 0 };
// inline SDK::Player SilentCachedLastTarget{};
// inline bool IsSilentEnabled{ true };
// inline bool SilentStickyAim{ false };
// inline int SilentAimKeybind{ 0 };
// inline bool SilentFTarget{ false };


// Вспомогательная структура SilentHelper (без изменений)
struct SilentHelper final
{
    std::uint64_t Address = 0;
    static std::uint64_t CachedInputObject;

    SilentHelper() = default;
    SilentHelper(std::uint64_t addr) : Address(addr) {}

    void SetFramePosX(std::uint64_t position) const;  // const OK - только пишет по адресу
    void SetFramePosY(std::uint64_t position) const;  // const OK - только пишет по адресу

    // FIX: убираем const - эти методы меняют CachedInputObject
    void InitializeMouseService(std::uint64_t address);
    void WriteMousePosition(std::uint64_t address, float x, float y);
};