/**
 * boilerpipe
 *
 * Copyright (c) 2009, 2014 Christian Kohlschütter
 *
 * The author 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.
 */
package com.kohlschutter.boilerpipe.document;

import java.util.ArrayList;
import java.util.List;

/**
 * A text document, consisting of one or more {@link TextBlock}s.
 */
public class TextDocument implements Cloneable {
  final List<TextBlock> textBlocks;
  String title;

  /**
   * Creates a new {@link TextDocument} with given {@link TextBlock}s, and no title.
   * 
   * @param textBlocks The text blocks of this document.
   */
  public TextDocument(final List<TextBlock> textBlocks) {
    this(null, textBlocks);
  }

  /**
   * Creates a new {@link TextDocument} with given {@link TextBlock}s and given title.
   * 
   * @param title The "main" title for this text document.
   * @param textBlocks The text blocks of this document.
   */
  public TextDocument(final String title, final List<TextBlock> textBlocks) {
    this.title = title;
    this.textBlocks = textBlocks;
  }

  /**
   * Returns the {@link TextBlock}s of this document.
   * 
   * @return A list of {@link TextBlock}s, in sequential order of appearance.
   */
  public List<TextBlock> getTextBlocks() {
    return textBlocks;
  }

  /**
   * Returns the "main" title for this document, or <code>null</code> if no such title has ben set.
   * 
   * @return The "main" title.
   */
  public String getTitle() {
    return title;
  }

  /**
   * Updates the "main" title for this document.
   * 
   * @param title
   */
  public void setTitle(final String title) {
    this.title = title;
  }

  /**
   * Returns the {@link TextDocument}'s content.
   * 
   * @return The content text.
   */
  public String getContent() {
    return getText(true, false);
  }

  /**
   * Returns the {@link TextDocument}'s content, non-content or both
   * 
   * @param includeContent Whether to include TextBlocks marked as "content".
   * @param includeNonContent Whether to include TextBlocks marked as "non-content".
   * @return The text.
   */
  public String getText(boolean includeContent, boolean includeNonContent) {
    StringBuilder sb = new StringBuilder();
    LOOP : for (TextBlock block : getTextBlocks()) {
      if (block.isContent()) {
        if (!includeContent) {
          continue LOOP;
        }
      } else {
        if (!includeNonContent) {
          continue LOOP;
        }
      }
      sb.append(block.getText());
      sb.append('\n');
    }
    return sb.toString();
  }

  /**
   * Returns detailed debugging information about the contained {@link TextBlock}s.
   * 
   * @return Debug information.
   */
  public String debugString() {
    StringBuilder sb = new StringBuilder();
    for (TextBlock tb : getTextBlocks()) {
      sb.append(tb.toString());
      sb.append('\n');
    }
    return sb.toString();
  }

  public TextDocument clone() {
    final List<TextBlock> list = new ArrayList<TextBlock>(textBlocks.size());
    for (TextBlock tb : textBlocks) {
      list.add(tb.clone());
    }
    return new TextDocument(title, list);
  }
}
