// Environment statistics: env_stat / env_info
// Раздел учебника: Том II, глава 9, «Конфигурация окружения», раздел «env_stat».
// Что демонстрирует: mdbx_env_stat_ex()/mdbx_env_info_ex(): страницы по типам
//   (leaf/branch/overflow), высоту B-дерева, число записей, размер геометрии,
//   txnid и «хвостового» читателя.
// Сборка: g++ -std=c++17 -I<libmdbx-include> -I../common 12-env-stat.c++ -lmdbx
// Запуск: ./12-env-stat
// Ожидаемый вывод (значения зависят от объёма данных):
//   stat: ps=4096 depth=2 leaf=1 branch=1 overflow=0 entries=100
//   info: recent_txnid=<N> latter_reader_txnid=<M>
//   ok: env_stat/env_info read
// При сбое — сообщение в stderr и exit 1.
//
// SPDX-License-Identifier: Apache-2.0

#include <iostream>
#include <string>

#include "common.h++"
#include <mdbx.h++>

int main() {
  try {
    const std::string path = std::string(example::tmpdir()) + "/mdbx-12-env-stat.mdbx";
    mdbx::env::remove(path);
    mdbx::env_managed env = example::env_open(path);

    {
      auto txn = env.start_write();
      auto table = txn.open_map(nullptr);
      for (int i = 0; i < 100; ++i) {
        const auto key = std::to_string(i);
        const auto value = "value-" + std::to_string(i);
        txn.insert(table, mdbx::slice(key), mdbx::slice(value));
      }
      txn.commit();
    }

    // аналог mdbx_env_stat_ex()
    const auto stat = env.get_stat();
    std::cout << "stat: ps=" << stat.ms_psize << " depth=" << stat.ms_depth << " leaf=" << stat.ms_leaf_pages
              << " branch=" << stat.ms_branch_pages << " overflow=" << stat.ms_overflow_pages
              << " entries=" << stat.ms_entries << "\n";

    // аналог mdbx_env_info_ex()
    const auto info = env.get_info();
    std::cout << "info: recent_txnid=" << info.mi_recent_txnid << " latter_reader_txnid=" << info.mi_latter_reader_txnid
              << " geo.current=" << info.mi_geo.current << "\n";

    std::cout << "ok: env_stat/env_info read\n";
    return EXIT_SUCCESS;
  } catch (const std::exception &ex) {
    std::cerr << "error: " << ex.what() << "\n";
    return EXIT_FAILURE;
  }
}