/*
 * 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.
 */

package opennlp.tools.coref.mention;

import opennlp.tools.util.Span;

/**
 * Data structure representation of a mention.
 */
public class Mention implements Comparable<Mention> {

  /** 
   * Represents the character offset for this extent. 
   */
  private Span span;

  /** 
   * A string representing the type of this extent. This is helpful for determining
   * which piece of code created a particular extent.
   */
  protected String type;
  
  /** 
   * The entity id indicating which entity this extent belongs to.  This is only
   * used when training a coreference classifier.
   */
  private int id;

  /** 
   * Represents the character offsets of the the head of this extent.
   */
  private Span headSpan;

  /** 
   * The parse node that this extent is based on.
   */
  protected Parse parse;

  /** 
   * A string representing the name type for this extent. 
   */
  protected String nameType;

  public Mention(Span span, Span headSpan, int entityId, Parse parse, String extentType) {
    this.span = span;
    this.headSpan = headSpan;
    this.id = entityId;
    this.type = extentType;
    this.parse = parse;
  }

  public Mention(Span span, Span headSpan, int entityId, Parse parse, String extentType, String nameType) {
    this.span = span;
    this.headSpan = headSpan;
    this.id = entityId;
    this.type = extentType;
    this.parse = parse;
    this.nameType = nameType;
  }

  public Mention(Mention mention) {
    this(mention.span,mention.headSpan,mention.id,mention.parse,mention.type,mention.nameType);
  }

  /**
   * Returns the character offsets for this extent.
   * 
   * @return The span representing the character offsets of this extent.
   */
  public Span getSpan() {
    return span;
  }

  /**
   * Returns the character offsets for the head of this extent.
   * 
   * @return The span representing the character offsets for the head of this extent.
   */
  public Span getHeadSpan() {
    return headSpan;
  }

  /**
   * Returns the parse node that this extent is based on.
   * 
   * @return The parse node that this extent is based on or null if the extent is newly created.
   */
  public Parse getParse() {
    return parse;
  }

  public int compareTo(Mention e) {
    return span.compareTo(e.span);
  }

  /**
   * Specifies the parse for this mention.
   * @param parse The parse for this mention.
   */
  public void setParse(Parse parse) {
    this.parse = parse;
  }

  /**
   * Returns the named-entity category associated with this mention.
   * 
   * @return the named-entity category associated with this mention.
   */
  public String getNameType() {
    return nameType;
  }

  /**
   * Specifies the named-entity category associated with this mention.
   * 
   * @param nameType the named-entity category associated with this mention.
   */
  protected void setNameType(String nameType) {
    this.nameType = nameType;
  }

  /**
   * Associates an id with this mention.
   * 
   * @param i The id for this mention.
   */
  public void setId(int i) {
    id = i;
  }

  /**
   * Returns the id associated with this mention.
   * 
   * @return the id associated with this mention.
   */
  public int getId() {
    return id;
  }

  @Override
  public String toString() {
    return "mention(span=" + span + ",hs=" + headSpan + ", type="
        + type + ", id=" + id + " " + parse + " )";
  }
}
