#pragma once

#ifndef GEODE_PDXAUTOSERIALIZER_OUTPUTFORMATTER_H_
#define GEODE_PDXAUTOSERIALIZER_OUTPUTFORMATTER_H_

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

#include <ostream>
#include <streambuf>
#include <fstream>
#include <string>

namespace apache {
namespace geode {
namespace client {
namespace pdx_auto_serializer {
/** The default character to use for indentation. */
const char DefaultIndentChar = ' ';

/** The default indentation size. */
const int DefaultIndentSize = 2;

/**
 * A<code>std::streambuf</code> class that formats the buffer with
 * appropriate indentation.
 *
 * It derives from the standard <code>std::streambuf</code> class and
 * turns off buffering while delegating the actual task to another
 * <code>std::streambuf</code> contained in it. This is required so that
 * the <code>OutputFormatStreamBuf::overflow</code> method is called for
 * every write.
 */
class OutputFormatStreamBuf : public std::streambuf {
 public:
  /** Default constructor. */
  OutputFormatStreamBuf();

  /**
   * Initialize the buffer with the given <code>std::streambuf</code>
   * and given indentation character, indentation size.
   *
   * @param buf The actual <code>std::streambuf</code> to be used for
   *            buffering.
   * @param indentChar The character to use for indentation of each line.
   * @param indentSize The size for each level of indentation.
   */
  void init(std::streambuf* buf, char indentChar, int indentSize);

  /**
   * Change the indentation character.
   *
   * @param indentChar The new indentation character.
   */
  void setIndentChar(char indentChar);

  /**
   * Change the number of characters for each indentation level.
   *
   * @param indentSize The new size for indentation.
   */
  void setIndentSize(int indentSize);

  /** Increase the current indentation level by one. */
  void increaseIndent();

  /** Decrease the current indentation level by one. */
  void decreaseIndent();

  /**
   * Get the current indentation level.
   *
   * @return The current indentation level.
   */
  virtual int getIndent() const;

  /**
   * Set the current indentation level.
   *
   * @param indentLevel The indentation level to set.
   */
  virtual void setIndent(int indentLevel);

  /** Virtual destructor. */
  virtual ~OutputFormatStreamBuf();

 protected:
  /**
   * The overriden <code>std::streambuf::overflow</code> method that
   * inserts the indentation characters when starting a new line.
   *
   * Note that buffering for this <code>streambuf</code> is turned off so
   * that this is called for every write and the contained
   * <code>m_buf</code> is the one actually used.
   *
   * @param c The character to be written.
   */
  virtual int overflow(int c);

  /** Overriden <code>std::streambuf::sync</code> method. */
  virtual int sync();

  /**
   * The contained <code>streambuf</code> that does the actual work of
   * buffering/writing.
   */
  std::streambuf* m_buf;

  /** The indentation character to be used. */
  char m_indentChar;

  /** The size of indentation in each level. */
  int m_indentSize;

  /** The current indentation level. */
  int m_indentLevel;

  /** True when a newline has just been encountered. */
  bool m_newLine;

  /** True when an opening brace has just been encountered. */
  bool m_openBrace;
};

/**
 * A<code>std::ostream</code> class that writes the output to a given file
 * and formats the output with appropriate indentation.
 */
class OutputFormatter : public std::ostream {
 public:
  /** The default constructor */
  OutputFormatter();

  /**
   * Open a given file for writing (just like <code>std::ofstream</code>
   * in the given mode and use the provided indentation character and size.
   *
   * @param fileName Name of the file to open.
   * @param mode The mode to use when opening the file -- default is to
   *             truncate the file and open in write mode.
   * @param indentChar The character to use for indentation.
   * @param indentSize The number of characters to use for indentation.
   */
  virtual void open(const std::string& fileName,
                    ios_base::openmode mode = ios_base::out | ios_base::trunc,
                    char indentChar = DefaultIndentChar,
                    int indentSize = DefaultIndentSize);

  /**
   * Change the indentation character.
   *
   * @param indentChar The new indentation character.
   */
  virtual void setIndentChar(char indentChar);

  /**
   * Change the number of characters for each indentation level.
   *
   * @param indentSize The new size for indentation.
   */
  virtual void setIndentSize(int indentSize);

  /** Increase the current indentation level by one. */
  virtual void increaseIndent();

  /** Decrease the current indentation level by one. */
  virtual void decreaseIndent();

  /**
   * Get the current indentation level.
   *
   * @return The current indentation level.
   */
  virtual int getIndent() const;

  /**
   * Set the current indentation level.
   *
   * @param indentLevel The indentation level to set.
   */
  virtual void setIndent(int indentLevel);

  /**
   * Get the underlying name of output file.
   *
   * @return The path of the output file.
   */
  std::string getFileName() const;

  /** Overrides the <code>std::ostream::flush</code> method to flush the
   * output stream to the file.
   */
  virtual void flush();

  /**
   * Overrides the <code>std::ostream::close</code> method to close the
   * underlying stream and file.
   */
  virtual void close();

 protected:
  /** The underlying output file stream object. */
  std::ofstream m_ofstream;

  /** The name of the output file. */
  std::string m_fileName;

  /** The formatter to use for formatting the output. */
  OutputFormatStreamBuf m_streamBuf;
};
}  // namespace pdx_auto_serializer
}  // namespace client
}  // namespace geode
}  // namespace apache

#endif  // GEODE_PDXAUTOSERIALIZER_OUTPUTFORMATTER_H_
