// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_TINT_WRITER_TEXT_GENERATOR_H_
#define SRC_TINT_WRITER_TEXT_GENERATOR_H_

#include <sstream>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>

#include "src/tint/diagnostic/diagnostic.h"
#include "src/tint/program_builder.h"

namespace tint {
namespace writer {

/// Helper methods for generators which are creating text output
class TextGenerator {
 public:
  /// Line holds a single line of text
  struct Line {
    /// The indentation of the line in blankspace
    uint32_t indent = 0;
    /// The content of the line, without a trailing newline character
    std::string content;
  };

  /// TextBuffer holds a list of lines of text.
  struct TextBuffer {
    // Constructor
    TextBuffer();

    // Destructor
    ~TextBuffer();

    /// IncrementIndent increases the indentation of lines that will be written
    /// to the TextBuffer
    void IncrementIndent();

    /// DecrementIndent decreases the indentation of lines that will be written
    /// to the TextBuffer
    void DecrementIndent();

    /// Appends the line to the end of the TextBuffer
    /// @param line the line to append to the TextBuffer
    void Append(const std::string& line);

    /// Inserts the line to the TextBuffer before the line with index `before`
    /// @param line the line to append to the TextBuffer
    /// @param before the zero-based index of the line to insert the text before
    /// @param indent the indentation to apply to the inserted lines
    void Insert(const std::string& line, size_t before, uint32_t indent);

    /// Appends the lines of `tb` to the end of this TextBuffer
    /// @param tb the TextBuffer to append to the end of this TextBuffer
    void Append(const TextBuffer& tb);

    /// Inserts the lines of `tb` to the TextBuffer before the line with index
    /// `before`
    /// @param tb the TextBuffer to insert into this TextBuffer
    /// @param before the zero-based index of the line to insert the text before
    /// @param indent the indentation to apply to the inserted lines
    void Insert(const TextBuffer& tb, size_t before, uint32_t indent);

    /// @returns the buffer's content as a single string
    /// @param indent additional indentation to apply to each line
    std::string String(uint32_t indent = 0) const;

    /// The current indentation of the TextBuffer. Lines appended to the
    /// TextBuffer will use this indentation.
    uint32_t current_indent = 0;

    /// The lines
    std::vector<Line> lines;
  };

  /// Constructor
  /// @param program the program used by the generator
  explicit TextGenerator(const Program* program);
  ~TextGenerator();

  /// Increment the emitter indent level
  void increment_indent() { current_buffer_->IncrementIndent(); }
  /// Decrement the emitter indent level
  void decrement_indent() { current_buffer_->DecrementIndent(); }

  /// @returns the result data
  std::string result() const { return main_buffer_.String(); }

  /// @returns the list of diagnostics raised by the generator.
  const diag::List& Diagnostics() const { return diagnostics_; }

  /// @returns the error
  std::string error() const { return diagnostics_.str(); }

  /// @return a new, unique identifier with the given prefix.
  /// @param prefix optional prefix to apply to the generated identifier. If
  /// empty "tint_symbol" will be used.
  std::string UniqueIdentifier(const std::string& prefix = "");

  /// @param s the semantic structure
  /// @returns the name of the structure, taking special care of builtin
  /// structures that start with double underscores. If the structure is a
  /// builtin, then the returned name will be a unique name without the leading
  /// underscores.
  std::string StructName(const sem::Struct* s);

  /// @param str the string
  /// @param suffix the suffix to remove
  /// @return returns str without the provided trailing suffix string. If str
  /// doesn't end with suffix, str is returned unchanged.
  std::string TrimSuffix(std::string str, const std::string& suffix);

 protected:
  /// LineWriter is a helper that acts as a string buffer, who's content is
  /// emitted to the TextBuffer as a single line on destruction.
  struct LineWriter {
   public:
    /// Constructor
    /// @param buffer the TextBuffer that the LineWriter will append its
    /// content to on destruction, at the end of the buffer.
    explicit LineWriter(TextBuffer* buffer);

    /// Move constructor
    /// @param rhs the LineWriter to move
    LineWriter(LineWriter&& rhs);
    /// Destructor
    ~LineWriter();

    /// @returns the ostringstream
    operator std::ostream&() { return os; }

    /// @param rhs the value to write to the line
    /// @returns the ostream so calls can be chained
    template <typename T>
    std::ostream& operator<<(T&& rhs) {
      return os << std::forward<T>(rhs);
    }

   private:
    LineWriter(const LineWriter&) = delete;
    LineWriter& operator=(const LineWriter&) = delete;

    std::ostringstream os;
    TextBuffer* buffer;
  };

  /// Helper for writing a '(' on construction and a ')' destruction.
  struct ScopedParen {
    /// Constructor
    /// @param stream the std::ostream that will be written to
    explicit ScopedParen(std::ostream& stream);
    /// Destructor
    ~ScopedParen();

   private:
    ScopedParen(ScopedParen&& rhs) = delete;
    ScopedParen(const ScopedParen&) = delete;
    ScopedParen& operator=(const ScopedParen&) = delete;
    std::ostream& s;
  };

  /// Helper for incrementing indentation on construction and decrementing
  /// indentation on destruction.
  struct ScopedIndent {
    /// Constructor
    /// @param buffer the TextBuffer that the ScopedIndent will indent
    explicit ScopedIndent(TextBuffer* buffer);
    /// Constructor
    /// @param generator ScopedIndent will indent the generator's
    /// `current_buffer_`
    explicit ScopedIndent(TextGenerator* generator);
    /// Destructor
    ~ScopedIndent();

   private:
    ScopedIndent(ScopedIndent&& rhs) = delete;
    ScopedIndent(const ScopedIndent&) = delete;
    ScopedIndent& operator=(const ScopedIndent&) = delete;
    TextBuffer* buffer_;
  };

  /// @returns the resolved type of the ast::Expression `expr`
  /// @param expr the expression
  const sem::Type* TypeOf(const ast::Expression* expr) const {
    return builder_.TypeOf(expr);
  }

  /// @returns the resolved type of the ast::Type `type`
  /// @param type the type
  const sem::Type* TypeOf(const ast::Type* type) const {
    return builder_.TypeOf(type);
  }

  /// @returns the resolved type of the ast::TypeDecl `type_decl`
  /// @param type_decl the type
  const sem::Type* TypeOf(const ast::TypeDecl* type_decl) const {
    return builder_.TypeOf(type_decl);
  }

  /// @returns a new LineWriter, used for buffering and writing a line to
  /// the end of #current_buffer_.
  LineWriter line() { return LineWriter(current_buffer_); }

  /// @param buffer the TextBuffer to write the line to
  /// @returns a new LineWriter, used for buffering and writing a line to
  /// the end of `buffer`.
  static LineWriter line(TextBuffer* buffer) { return LineWriter(buffer); }

  /// The program
  Program const* const program_;
  /// A ProgramBuilder that thinly wraps program_
  ProgramBuilder builder_;
  /// Diagnostics generated by the generator
  diag::List diagnostics_;
  /// The buffer the TextGenerator is currently appending lines to
  TextBuffer* current_buffer_ = &main_buffer_;

 private:
  /// The primary text buffer that the generator will emit
  TextBuffer main_buffer_;
  /// Map of builtin structure to unique generated name
  std::unordered_map<const sem::Struct*, std::string> builtin_struct_names_;
};

}  // namespace writer
}  // namespace tint

#endif  // SRC_TINT_WRITER_TEXT_GENERATOR_H_
