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

#include <cstddef>
#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);
};
