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

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

#include <string>
#include <vector>

#include "cmCursesForm.h"
#include "cmCursesStandardIncludes.h"

class cmCursesLongMessageForm : public cmCursesForm
{
public:
  enum class ScrollBehavior
  {
    NoScroll,
    ScrollDown
  };

  cmCursesLongMessageForm(std::vector<std::string> const& messages,
                          const char* title, ScrollBehavior scrollBehavior);
  ~cmCursesLongMessageForm() override;

  cmCursesLongMessageForm(cmCursesLongMessageForm const&) = delete;
  cmCursesLongMessageForm& operator=(cmCursesLongMessageForm const&) = delete;

  void UpdateContent(std::string const& output, std::string const& title);

  // Description:
  // Handle user input.
  void HandleInput() override;

  // Description:
  // Display form. Use a window of size width x height, starting
  // at top, left.
  void Render(int left, int top, int width, int height) override;

  // Description:
  // This method should normally  called only by the form.
  // The only exception is during a resize.
  void PrintKeys();

  // Description:
  // This method should normally  called only by the form.
  // The only exception is during a resize.
  void UpdateStatusBar() override;

protected:
  static constexpr int MAX_CONTENT_SIZE = 60000;

  void DrawMessage(const char* msg) const;

  std::string Messages;
  std::string Title;
  ScrollBehavior Scrolling;

  FIELD* Fields[2];
};
