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

#include "cmConfigure.h" // IWYU pragma: keep

#include <cstddef>
#include <istream>
#include <string>
#include <utility>
#include <vector>

namespace Json {
class Value;
}

class cmJSONState
{
  using Location = struct
  {
    int line;
    int column;
  };

public:
  using JsonPair = std::pair<std::string const, Json::Value const*>;

  enum class StrictMode
  {
    Strict,
    Relaxed,
  };

  cmJSONState() = default;
  cmJSONState(std::string jsonFile, Json::Value* root,
              StrictMode strictMode = StrictMode::Strict);
  cmJSONState(std::istream& jsonIStream, Json::Value* root,
              StrictMode strictMode = StrictMode::Strict);

  void AddError(std::string const& errMsg);
  void AddErrorAtValue(std::string const& errMsg, Json::Value const* value);
  void AddErrorAtOffset(std::string const& errMsg, std::ptrdiff_t offset);
  std::string GetErrorMessage(bool showContext = true);
  std::string key();
  std::string key_after(std::string const& key);
  Json::Value const* value_after(std::string const& key);
  void push_stack(std::string const& key, Json::Value const* value);
  void pop_stack();

  class Error
  {
  public:
    Error(Location loc, std::string errMsg)
      : location(loc)
      , message(std::move(errMsg)) {};
    Error(std::string errMsg)
      : location({ -1, -1 })
      , message(std::move(errMsg)) {};
    std::string GetErrorMessage() const { return message; }
    Location GetLocation() const { return location; }

  private:
    Location location;
    std::string message;
  };

  std::vector<JsonPair> parseStack;
  std::vector<Error> errors;
  std::string doc;
  bool allowComments = false;

private:
  void ReadJSONStream(std::istream& jsonIStream, Json::Value* root,
                      StrictMode strictMode);
  std::string GetJsonContext(Location loc);
  Location LocateInDocument(ptrdiff_t offset);
  std::string Filename;
};
