/* Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Volker Friese [committer] */

#include "MainConfig.h"

#include <fstream>

#include <yaml-cpp/yaml.h>

namespace cbm::algo
{

  // -----   Load configuration from YAML file   --------------------------------
  void MainConfig::LoadYaml(const std::string& filename)
  {
    YAML::Node config = YAML::LoadFile(filename);

    // --- Digi trigger
    fTriggerDet       = ToCbmModuleIdCaseInsensitive(config["trigger"]["detector"].as<std::string>());
    fTriggerWin       = config["trigger"]["window"].as<double>();
    fTriggerThreshold = config["trigger"]["threshold"].as<size_t>();
    fTriggerDeadTime  = config["trigger"]["deadtime"].as<double>();

    // --- Event builder: (detector -> (tMin, tMax))
    if (auto eventbuilder = config["eventbuilder"]) {
      if (auto windows = eventbuilder["windows"]) {
        for (YAML::const_iterator it = windows.begin(); it != windows.end(); ++it) {
          auto det              = ToCbmModuleIdCaseInsensitive(it->first.as<std::string>());
          auto lower            = it->second[0].as<double>();
          auto upper            = it->second[1].as<double>();
          fEvtbuildWindows[det] = std::make_pair(lower, upper);
        }
      }
    }

    // --- Event selector parameters
    fSelectMinStationsSts = config["selector"]["minStationsSts"].as<size_t>();
    fSelectMinStationsTof = config["selector"]["minStationsTof"].as<size_t>();
    fSelectMinDigisBmon   = config["selector"]["minDigisBmon"].as<size_t>();

    // --- Branch persistence in output file
    fStoreTimeslice = config["store"]["timeslice"].as<bool>();
    fStoreTrigger   = config["store"]["triggers"].as<bool>();
    fStoreEvents    = config["store"]["events"].as<bool>();

    // --- QA publishing
    fHttpServerRefreshRate = config["qa"]["refreshrate"].as<int32_t>(fHttpServerRefreshRate);
  }
  // ----------------------------------------------------------------------------


  // -----   Save configuration to YAML file   ----------------------------------
  void MainConfig::SaveYaml(const std::string& filename)
  {
    YAML::Node config;

    // --- Digi trigger
    config["trigger"]["detector"]  = ToString(fTriggerDet);
    config["trigger"]["window"]    = fTriggerWin;
    config["trigger"]["threshold"] = fTriggerThreshold;
    config["trigger"]["deadtime"]  = fTriggerDeadTime;

    // --- Event builder: (detector -> (tMin, tMax))
    for (const auto& [key, value] : fEvtbuildWindows) {
      auto det = ToString(key);
      config["eventbuilder"]["windows"][det].push_back(value.first);
      config["eventbuilder"]["windows"][det].push_back(value.second);
    };

    // --- Event selector
    config["selector"]["minStationsSts"] = fSelectMinStationsSts;
    config["selector"]["minStationsTof"] = fSelectMinStationsTof;
    config["selector"]["minDigisBmon"]   = fSelectMinDigisBmon;


    // --- Branch persistence in output file
    config["store"]["timeslice"] = fStoreTimeslice;
    config["store"]["triggers"]  = fStoreTrigger;
    config["store"]["events"]    = fStoreEvents;
    // --- QA publishing
    config["qa"]["refreshrate"] = fHttpServerRefreshRate;
    // ---
    std::ofstream fout(filename);
    fout << config;
  }
  // ----------------------------------------------------------------------------

} /* namespace cbm::algo */