// Copyright 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_DBUS_BINDINGS_INDENTED_TEXT_H_
#define CHROMEOS_DBUS_BINDINGS_INDENTED_TEXT_H_

#include <string>
#include <utility>
#include <vector>

#include <base/macros.h>

namespace chromeos_dbus_bindings {

class IndentedText {
 public:
  IndentedText();
  virtual ~IndentedText() = default;

  // Insert a blank line.
  void AddBlankLine();

  // Insert a block of indented text.
  void AddBlock(const IndentedText& block);
  void AddBlockWithOffset(const IndentedText& block, size_t shift);

  // Add a line at the current indentation.
  void AddLine(const std::string& line);
  void AddLineWithOffset(const std::string& line, size_t shift);
  // Adds a line and pushes an offset past the |nth_occurrence| of character |c|
  // in that line, effectively allowing to align following line to the position
  // following that character.
  void AddLineAndPushOffsetTo(const std::string& line,
                              size_t nth_occurrence,
                              char c);

  // Adds a block of comments.
  void AddComments(const std::string& doc_string);

  // Return a string representing the indented text.
  std::string GetContents() const;

  // Add or remove an offset to the current stack of indentation offsets.
  void PushOffset(size_t shift);
  void PopOffset();

  // Reset to initial state.
  void Reset();


 private:
  using IndentedLine = std::pair<std::string, size_t>;

  friend class IndentedTextTest;

  size_t offset_;
  std::vector<size_t> offset_history_;
  std::vector<IndentedLine> contents_;

  DISALLOW_COPY_AND_ASSIGN(IndentedText);
};

}  // namespace chromeos_dbus_bindings

#endif  // CHROMEOS_DBUS_BINDINGS_INDENTED_TEXT_H_
