/* 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 <iosfwd>
#include <map>
#include <set>
#include <string>
#include <utility>
#include <vector>

#include "cmsys/RegularExpression.hxx"

/** \class cmRST
 * \brief Perform basic .rst processing for command-line help
 *
 * This class implements a subset of reStructuredText and Sphinx
 * document processing.  It is used to print command-line help.
 *
 * If you modify the capabilities of this class, be sure to update
 * the Help/manual/cmake-developer.7.rst documentation and to update
 * the Tests/CMakeLib/testRST.(rst|expect) test input and output.
 */
class cmRST
{
public:
  cmRST(std::string docroot);
  bool ProcessFile(std::string const& fname, bool isModule = false);
  void Write(std::ostream& os);

private:
  enum class Include
  {
    Normal,
    Module,
    TocTree
  };
  enum class Markup
  {
    None,
    Normal,
    Empty
  };
  enum class Directive
  {
    None,
    ParsedLiteral,
    LiteralBlock,
    CodeBlock,
    Replace,
    TocTree
  };

  struct ContentLine
  {
    ContentLine() = default;
    ContentLine(std::string l, size_t c, bool m)
      : Content{ std::move(l) }
      , Context{ c }
      , InlineMarkup{ m }
    {
    }

    std::string Content;
    size_t Context;
    bool InlineMarkup;
  };

  void ProcessRST(std::istream& is);
  void ProcessModule(std::istream& is);
  void Reset();
  void ProcessLine(std::string const& line);
  void NormalLine(std::string const& line);
  void OutputLine(std::string const& line, bool inlineMarkup);
  void WriteLine(std::ostream& os, ContentLine const& content);
  std::string ReplaceSubstitutions(std::string const& line, size_t context);
  void OutputMarkupLines(bool inlineMarkup);
  bool ProcessInclude(std::string file, Include type);
  void ProcessDirectiveParsedLiteral();
  void ProcessDirectiveLiteralBlock();
  void ProcessDirectiveCodeBlock();
  void ProcessDirectiveReplace();
  void ProcessDirectiveTocTree();
  static void UnindentLines(std::vector<std::string>& lines);

  std::string DocRoot;
  int IncludeDepth = 0;
  size_t ContextOffset = 0;
  bool OutputLinePending = false;
  bool LastLineEndedInColonColon = false;
  Markup MarkupType = Markup::None;
  Directive DirectiveType = Directive::None;
  cmsys::RegularExpression CMakeDirective;
  cmsys::RegularExpression CMakeModuleDirective;
  cmsys::RegularExpression ParsedLiteralDirective;
  cmsys::RegularExpression CodeBlockDirective;
  cmsys::RegularExpression ReplaceDirective;
  cmsys::RegularExpression IncludeDirective;
  cmsys::RegularExpression TocTreeDirective;
  cmsys::RegularExpression ProductionListDirective;
  cmsys::RegularExpression NoteDirective;
  cmsys::RegularExpression VersionDirective;
  cmsys::RegularExpression ModuleRST;
  cmsys::RegularExpression CMakeRole;
  cmsys::RegularExpression InlineLink;
  cmsys::RegularExpression InlineLiteral;
  cmsys::RegularExpression Substitution;
  cmsys::RegularExpression TocTreeLink;
  cmsys::RegularExpression Header;

  std::string::size_type LastLength;
  std::vector<std::string> MarkupLines;
  std::vector<ContentLine> OutputLines;
  std::string DocDir;
  std::vector<std::map<std::string, std::string>> Replace;
  std::set<std::string> Replaced;
  std::string ReplaceName;
};
