BareGit
#pragma once

#include <chrono>
#include <condition_variable>
#include <cstdint>
#include <mutex>

#include "protocol.hpp"

namespace nethack_mcp
{

/// Own and publish complete snapshots without exposing engine memory.
class ObservationStore
{
public:
    /// Construct an idle store with a stable initial snapshot.
    ObservationStore();

    /// Return the latest complete snapshot.
    Json snapshot() const;

    /// Publish a replacement snapshot and return its new revision.
    std::uint64_t publish(Json snapshot);

    /// Wait for a revision newer than `revision`, or return the latest state.
    Json waitForRevision(
        std::uint64_t revision,
        std::chrono::milliseconds timeout) const;

private:
    mutable std::mutex mutex_;
    mutable std::condition_variable condition_;
    Json snapshot_;
    std::uint64_t revision_ = 0;
};

} // namespace nethack_mcp