/*
 * 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 org.apache.samoa.learners;

import org.apache.samoa.core.ContentEvent;
import org.apache.samoa.core.SerializableInstance;
import org.apache.samoa.instances.Instance;

/**
 * The Class ResultEvent.
 */
final public class ResultContentEvent implements ContentEvent {

  /**
	 * 
	 */
  private static final long serialVersionUID = -2650420235386873306L;
  private long instanceIndex;
  private int classifierIndex;
  private int evaluationIndex;
  private SerializableInstance instance;

  private int classId;
  private double[] classVotes;

  private final boolean isLast;
  private long arrivalTimestamp;

  public ResultContentEvent() {
    this.isLast = false;
  }

  public ResultContentEvent(boolean isLast) {
    this.isLast = isLast;
  }

  /**
   * Instantiates a new result event.
   * 
   * @param instanceIndex
   *          the instance index
   * @param instance
   *          the instance
   * @param classId
   *          the class id
   * @param classVotes
   *          the class votes
   */
  public ResultContentEvent(long instanceIndex, Instance instance, int classId,
      double[] classVotes, boolean isLast, long arrivalTimestamp) {
    if (instance != null) {
      this.instance = new SerializableInstance(instance);
    }
    this.instanceIndex = instanceIndex;
    this.classId = classId;
    this.classVotes = classVotes;
    this.isLast = isLast;
    this.arrivalTimestamp = arrivalTimestamp;
  }

  /**
   * Gets the single instance of ResultEvent.
   * 
   * @return single instance of ResultEvent
   */
  public SerializableInstance getInstance() {
    return instance;
  }

  /**
   * Sets the instance.
   * 
   * @param instance
   *          the new instance
   */
  public void setInstance(SerializableInstance instance) {
    this.instance = instance;
  }

  /**
   * Gets the num classes.
   * 
   * @return the num classes
   */
  public int getNumClasses() { // To remove
    return instance.numClasses();
  }

  /**
   * Gets the instance index.
   * 
   * @return the index of the data vector.
   */
  public long getInstanceIndex() {
    return instanceIndex;
  }

  /**
   * Gets the class id.
   * 
   * @return the true class of the vector.
   */
  public int getClassId() { // To remove
    return classId;// (int) instance.classValue();//classId;
  }

  /**
   * Gets the class votes.
   * 
   * @return the class votes
   */
  public double[] getClassVotes() {
    return classVotes;
  }

  /**
   * Sets the class votes.
   * 
   * @param classVotes
   *          the new class votes
   */
  public void setClassVotes(double[] classVotes) {
    this.classVotes = classVotes;
  }

  /**
   * Gets the classifier index.
   * 
   * @return the classifier index
   */
  public int getClassifierIndex() {
    return classifierIndex;
  }

  /**
   * Sets the classifier index.
   * 
   * @param classifierIndex
   *          the new classifier index
   */
  public void setClassifierIndex(int classifierIndex) {
    this.classifierIndex = classifierIndex;
  }

  /**
   * Gets the evaluation index.
   * 
   * @return the evaluation index
   */
  public int getEvaluationIndex() {
    return evaluationIndex;
  }

  /**
   * Sets the evaluation index.
   * 
   * @param evaluationIndex
   *          the new evaluation index
   */
  public void setEvaluationIndex(int evaluationIndex) {
    this.evaluationIndex = evaluationIndex;
  }

  /*
   * (non-Javadoc)
   * 
   * @see samoa.core.ContentEvent#getKey(int)
   */
  // @Override
  public String getKey(int key) {
    if (key == 0)
      return Long.toString(this.getEvaluationIndex());
    else
      return Long.toString(this.getEvaluationIndex()
          + 1000 * this.getInstanceIndex());
  }

  @Override
  public String getKey() {
    return Long.toString(this.getEvaluationIndex() % 100);
  }

  @Override
  public void setKey(String str) {
    this.evaluationIndex = Integer.parseInt(str);
  }

  @Override
  public boolean isLastEvent() {
    return isLast;
  }
  
  public long getArrivalTimestamp() {
      return arrivalTimestamp;
  }

}
