/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#include "cmFileAPIConfigureLog.h"

#include <cm3p/json/value.h>

#include "cmFileAPI.h"
#include "cmStringAlgorithms.h"
#include "cmake.h"

namespace {

class ConfigureLog
{
  cmFileAPI& FileAPI;
  unsigned long Version;

  Json::Value DumpPath();
  Json::Value DumpEventKindNames();

public:
  ConfigureLog(cmFileAPI& fileAPI, unsigned long version);
  Json::Value Dump();
};

ConfigureLog::ConfigureLog(cmFileAPI& fileAPI, unsigned long version)
  : FileAPI(fileAPI)
  , Version(version)
{
  static_cast<void>(this->Version);
}

Json::Value ConfigureLog::Dump()
{
  Json::Value configureLog = Json::objectValue;
  configureLog["path"] = this->DumpPath();
  configureLog["eventKindNames"] = this->DumpEventKindNames();
  return configureLog;
}

Json::Value ConfigureLog::DumpPath()
{
  return cmStrCat(this->FileAPI.GetCMakeInstance()->GetHomeOutputDirectory(),
                  "/CMakeFiles/CMakeConfigureLog.yaml");
}

Json::Value ConfigureLog::DumpEventKindNames()
{
  // Report at most one version of each event kind.
  // If a new event kind is added, increment ConfigureLogV1Minor.
  // If a new version of an existing event kind is added, a new
  // major version of the configureLog object kind is needed.
  Json::Value eventKindNames = Json::arrayValue;
  if (this->Version == 1) {
    eventKindNames.append("message-v1");     // WriteMessageEvent
    eventKindNames.append("try_compile-v1"); // WriteTryCompileEvent
    eventKindNames.append("try_run-v1");     // WriteTryRunEvent
  }
  return eventKindNames;
}
}

Json::Value cmFileAPIConfigureLogDump(cmFileAPI& fileAPI,
                                      unsigned long version)
{
  ConfigureLog configureLog(fileAPI, version);
  return configureLog.Dump();
}
