/*
 * Copyright (C) 2015, The Android Open Source Project
 *
 * 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.
 */

#pragma once

#include <stdio.h>

#include <functional>
#include <memory>
#include <ostream>
#include <string>
#include <utility>

#include <android-base/stringprintf.h>

namespace android {
namespace aidl {

class CodeWriter;
using CodeWriterPtr = std::unique_ptr<CodeWriter>;

class CodeWriter {
 public:
  // Get a CodeWriter that writes to a file. When filename is "-",
  // it is written to stdout.
  static CodeWriterPtr ForFile(const std::string& filename);
  // Get a CodeWriter that writes to a string buffer.
  // The buffer gets updated only after Close() is called or the CodeWriter
  // is deleted -- much like a real file.
  static CodeWriterPtr ForString(std::string* buf);
  // Write a formatted string to this writer in the usual printf sense.
  // Returns false on error.
  template <typename... Args>
  bool Write(const char* format, Args... args) __attribute__((format(printf, 2, 0))) {
    std::string formatted;
    android::base::StringAppendF(&formatted, format, args...);

    return WriteString(formatted);
  }

  template <>
  bool Write(const char* str) {
    return WriteString(str);
  }

  virtual bool WriteString(const std::string&);

  void Indent();
  void Dedent();
  virtual bool Close();
  virtual ~CodeWriter() = default;
  CodeWriter() = default;

  CodeWriter& operator<<(const char* s);
  CodeWriter& operator<<(const std::string& str);

 private:
  CodeWriter(std::unique_ptr<std::ostream> ostream);
  std::string ApplyIndent(const std::string& str);
  const std::unique_ptr<std::ostream> ostream_;
  int indent_level_ {0};
  bool start_of_line_ {true};
};

std::string QuotedEscape(const std::string& str);

}  // namespace aidl
}  // namespace android
