#include <utils/Stop.hpp>

#include <utils/ExecutionStatManager.hpp>
#include <utils/Messenger.hpp>
#include <utils/pugs_config.hpp>

#include <filesystem>
#include <iostream>

#ifdef PUGS_HAS_SLURM
#include <slurm/slurm.h>
#endif   // PUGS_HAS_SLURM

bool
stop()
{
  bool stop = false;

  if (parallel::rank() == 0) {
    std::filesystem::path stop_file("stop");
    if (std::filesystem::exists(stop_file)) {
      const double elapse_time = ExecutionStatManager::getInstance().getElapseTime();

      const double stop_file_age =
        std::chrono::duration_cast<std::chrono::seconds>(std::filesystem::file_time_type::clock::now() -
                                                         std::filesystem::last_write_time(stop_file))
          .count();

      stop = elapse_time > stop_file_age;
    }

#ifdef PUGS_HAS_SLURM
    char* env = getenv("SLURM_JOB_ID");
    if (env != nullptr) {
      slurm_init(nullptr);
      int slurm_job_id = std::atoi(env);

      if (slurm_get_rem_time(slurm_job_id) < 150) {
        stop = true;
      }

      slurm_fini();
    }
#endif   // PUGS_HAS_SLURM
  }

  parallel::broadcast(stop, 0);

  return stop;
}