/* 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 int Version;

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

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

ConfigureLog::ConfigureLog(cmFileAPI& fileAPI, unsigned int 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
    eventKindNames.append("find-v1");         // WriteFindBaseEvent
    eventKindNames.append("find_package-v1"); // WriteFindPackageEvent
  }
  return eventKindNames;
}
}

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