/*
 * Copyright (C) 2018 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.
 */

package com.android.textclassifier.utils;

import com.google.common.base.Preconditions;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.io.PrintWriter;

/**
 * A print writer that supports indentation.
 *
 * @see PrintWriter
 */
public final class IndentingPrintWriter {
  static final String SINGLE_INDENT = "  ";

  private final PrintWriter writer;
  private final StringBuilder indentBuilder = new StringBuilder();
  private String currentIndent = "";

  public IndentingPrintWriter(PrintWriter writer) {
    this.writer = Preconditions.checkNotNull(writer);
  }

  /** Prints a string. */
  @CanIgnoreReturnValue
  public IndentingPrintWriter println(String string) {
    writer.print(currentIndent);
    writer.print(string);
    writer.println();
    return this;
  }

  /** Prints a empty line */
  @CanIgnoreReturnValue
  public IndentingPrintWriter println() {
    writer.println();
    return this;
  }

  /** Increases indents for subsequent texts. */
  @CanIgnoreReturnValue
  public IndentingPrintWriter increaseIndent() {
    indentBuilder.append(SINGLE_INDENT);
    currentIndent = indentBuilder.toString();
    return this;
  }

  /** Decreases indents for subsequent texts. */
  @CanIgnoreReturnValue
  public IndentingPrintWriter decreaseIndent() {
    indentBuilder.delete(0, SINGLE_INDENT.length());
    currentIndent = indentBuilder.toString();
    return this;
  }

  /** Prints a key-valued pair. */
  @CanIgnoreReturnValue
  public IndentingPrintWriter printPair(String key, Object value) {
    println(String.format("%s=%s", key, String.valueOf(value)));
    return this;
  }

  /** Flushes the stream. */
  public void flush() {
    writer.flush();
  }
}
