#ifndef CONFIGURATION_H
#define CONFIGURATION_H

#include "rosa/config/version.h"
#include "rosa/deluxe/DeluxeContext.hpp"
#include "json.hpp"
#include <fstream>

using namespace rosa;
using nlohmann::json;

struct SignalConfiguration {
  std::string Name;
  bool Output;
  float InnerBound;
  float OuterBound;
  float InnerBoundDrift;
  float OuterBoundDrift;
};

struct AppConfiguration {
  std::string InputFilePath;
  std::string OutputFilePath;
  uint32_t BrokenCounter;
  uint32_t Length;
  std::vector<SignalConfiguration> SignalConfigurations;
};
/*
void to_json(json& J, const AppConfiguration& AC) {
    //This direction is not needed
  (void)J;
  (void)AC;
}

void to_json(json& J, const SignalConfiguration& SC) {
    //This direction is not needed
  (void)J;
  (void)SC;
}

void from_json(json& J, const AppConfiguration& AC) {
    J.at("InputFilePath").get_to(AC.InputFilePath);
    J.at("OutputFilePath").get_to(AC.OutputFilePath);
    J.at("BrokenCounter").get_to(AC.BrokenCounter);
    J.at("Length").get_to(AC.Length);
    //J.at("SignalConfigurations").get_to(AC.SignalConfigurations);
}

void from_json(json& J, const SignalConfiguration& SC) {
    J.at("Name").get_to(SC.Name);
    J.at("Output").get_to(SC.Output);
    J.at("InnerBound").get_to(SC.InnerBound);
    J.at("OuterBound").get_to(SC.OuterBound);
    J.at("InnerBoundDrift").get_to(SC.InnerBoundDrift);
    J.at("OuterBoundDrift").get_to(SC.OuterBoundDrift);
}
*/
AppConfiguration AppConfig = {"in.csv", "out.csv", 10, 10, {{"sig1", false, 0.1, 0.25, 0.4, 0.6},{"sig2", false, 0.1, 0.25, 0.4, 0.6},{"sig3", true, 0.1, 0.25, 0.4, 0.6}}};

bool readConfigFile(std::string ConfigPath) {

  LOG_INFO("READING CONFIG FILE");
  LOG_INFO_STREAM << "Looking for config file at \"" << ConfigPath << "\"\n";

  std::ifstream ConfigFile;
  ConfigFile.open(ConfigPath);

  if (!ConfigFile) {
    LOG_ERROR("Unable to open config file");
    return false;
  }

  json ConfigObj;
  ConfigFile >> ConfigObj;
  std::cout << ConfigObj << std::endl;

  try {
      //ConfigObj.get_to(AppConfig);
  } catch (nlohmann::detail::type_error ex) {
      LOG_ERROR("Misformatted Config File");
      return false;
  }

  return true;
}

#endif // CONFIGURATION_H
