#include <filesystem>  // NOLINT
#include <iostream>
#include <string>

#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "tlbmc/hal/shared_mem/metrics.h"
#include "tlbmc/hal/shared_mem/segment_manager.h"
#include "tlbmc/hal/shared_mem/server.h"

ABSL_FLAG(
    std::string, command, "",
    "Command to execute: 'get_metrics', 'check_segment', 'remove_segment'");

int main(int argc, char** argv) {
  absl::ParseCommandLine(argc, argv);
  using ::milotic_tlbmc::SharedMemoryServer;
  using ::milotic_tlbmc::TlbmcMetrics;
  std::string command = absl::GetFlag(FLAGS_command);

  if (command == "check_segment") {
    bool file_exists = std::filesystem::exists(
        std::string{milotic_tlbmc::kShareMemInitializedFile});
    bool segment_exists = false;
    try {
      boost::interprocess::managed_shared_memory sensors_memory(
          boost::interprocess::open_only, "TlbmcSharedMemory");
      segment_exists = true;
    } catch (const boost::interprocess::interprocess_exception& e) {
      segment_exists = false;
    }
    std::cerr << "file_exists: " << file_exists << '\n';
    std::cerr << "segment_exists: " << segment_exists << '\n';
    return 0;
  }

  if (command == "get_metrics") {
    const TlbmcMetrics* metrics =
        SharedMemoryServer::GetInstance().GetMetrics();
    std::cerr << "Metrics pointer is " << metrics << '\n';
    if (metrics != nullptr) {
      std::cerr << "Metrics is " << metrics->ToJson().dump(2) << '\n';
    }
    return 0;
  }

  if (command == "remove_segment") {
    boost::interprocess::shared_memory_object::remove("TlbmcSharedMemory");
    std::filesystem::remove(
        std::string{milotic_tlbmc::kShareMemInitializedFile});
    return 0;
  }

  return 0;
}