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

#include <map>
#include <memory>
#include <string>
#include <vector>

#include <cm/string_view>

#include "cmsys/FStream.hxx"

namespace Json {
class StreamWriter;
}

class cmMakefile;

class cmConfigureLog
{
public:
  /** Construct with the log directory and a sorted list of enabled log
      versions.  The latest log version will be enabled regardless.  */
  cmConfigureLog(std::string logDir, std::vector<unsigned int> logVersions);
  ~cmConfigureLog();

  /** Return true if at least one of the log versions in the given sorted
      list is enabled.  */
  bool IsAnyLogVersionEnabled(std::vector<unsigned int> const& v) const;

  void EnsureInit();

  void BeginEvent(std::string const& kind, cmMakefile const& mf);
  void EndEvent();

  void BeginArray();
  void NextArrayElement();
  void EndArray();

  void BeginObject(cm::string_view key);
  void EndObject();

  // TODO other value types
  void WriteValue(cm::string_view key, std::nullptr_t);
  void WriteValue(cm::string_view key, bool value);
  void WriteValue(cm::string_view key, int value);
  void WriteValue(cm::string_view key, std::string const& value);
  void WriteValue(cm::string_view key, std::vector<std::string> const& list);
  void WriteValue(cm::string_view key,
                  std::map<std::string, std::string> const& map);

  void WriteTextBlock(cm::string_view key, cm::string_view text);
  void WriteLiteralTextBlock(cm::string_view key, cm::string_view text);

  void WriteLiteralTextBlock(cm::string_view key, std::string const& text)
  {
    this->WriteLiteralTextBlock(key, cm::string_view{ text });
  }

private:
  std::string LogDir;
  std::vector<unsigned int> LogVersions;
  cmsys::ofstream Stream;
  unsigned Indent = 0;
  bool Opened = false;

  std::unique_ptr<Json::StreamWriter> Encoder;

  void WriteBacktrace(cmMakefile const& mf);
  void WriteChecks(cmMakefile const& mf);

  cmsys::ofstream& BeginLine();
  void EndLine();
  void WriteEscape(unsigned char c);
};
