BareGit
#include "observation_store.hpp"

#include <utility>

namespace nethack_mcp
{

ObservationStore::ObservationStore()
        : snapshot_({
              {"schema_version", 1},
              {"game_id", nullptr},
              {"revision", 0},
              {"lifecycle", "idle"},
              {"operation", nullptr},
              {"map", {
                  {"width", 79},
                  {"height", 21},
                  {"origin", {{"x", 1}, {"y", 0}}},
                  {"rows", Json::array()},
                  {"cursor", nullptr},
              }},
              {"status", Json::object()},
              {"messages", Json::array()},
              {"messages_truncated", false},
              {"inventory", {
                  {"known", false},
                  {"stale", true},
                  {"entries", Json::array()},
              }},
              {"pending", nullptr},
          })
{}

Json ObservationStore::snapshot() const
{
    std::lock_guard lock(mutex_);
    return snapshot_;
}

std::uint64_t ObservationStore::publish(Json snapshot)
{
    std::lock_guard lock(mutex_);
    ++revision_;
    snapshot["revision"] = revision_;
    snapshot_ = std::move(snapshot);
    condition_.notify_all();
    return revision_;
}

Json ObservationStore::waitForRevision(
    std::uint64_t revision,
    std::chrono::milliseconds timeout) const
{
    std::unique_lock lock(mutex_);
    condition_.wait_for(lock, timeout, [&] {
        return revision_ > revision;
    });
    return snapshot_;
}

} // namespace nethack_mcp