package org.apache.samoa.streams;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * 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.
 * #L%
 */

import java.io.IOException;

import org.apache.samoa.instances.Instances;
import org.apache.samoa.moa.core.InstanceExample;
import org.apache.samoa.moa.core.ObjectRepository;
import org.apache.samoa.moa.tasks.TaskMonitor;

import com.github.javacliparser.FileOption;
import com.github.javacliparser.IntOption;

/**
 * InstanceStream for ARFF file
 * 
 * @author Casey
 */
public class ArffFileStream extends FileStream {

  public FileOption arffFileOption = new FileOption("arffFile", 'f',
      "ARFF File(s) to load.", null, null, false);

  public IntOption classIndexOption = new IntOption("classIndex", 'c',
      "Class index of data. 0 for none or -1 for last attribute in file.",
      -1, -1, Integer.MAX_VALUE);

  protected InstanceExample lastInstanceRead;

  @Override
  public void prepareForUseImpl(TaskMonitor monitor, ObjectRepository repository) {
    super.prepareForUseImpl(monitor, repository);
    String filePath = this.arffFileOption.getFile().getAbsolutePath();
    this.fileSource.init(filePath, "arff");
    this.lastInstanceRead = null;
  }

  @Override
  protected void reset() {
    try {
      if (this.fileReader != null)
        this.fileReader.close();

      fileSource.reset();
    } catch (IOException ioe) {
      throw new RuntimeException("FileStream restart failed.", ioe);
    }

    if (!getNextFileReader()) {
      hitEndOfStream = true;
      throw new RuntimeException("FileStream is empty.");
    }
  }

  @Override
  protected boolean getNextFileReader() {
    boolean ret = super.getNextFileReader();
    if (ret) {
      this.instances = new Instances(this.fileReader, 1, -1);
      if (this.classIndexOption.getValue() < 0) {
        this.instances.setClassIndex(this.instances.numAttributes() - 1);
      } else if (this.classIndexOption.getValue() > 0) {
        this.instances.setClassIndex(this.classIndexOption.getValue() - 1);
      }
    }
    return ret;
  }

  @Override
  protected boolean readNextInstanceFromFile() {
    try {
      if (this.instances.readInstance(this.fileReader)) {
        this.lastInstanceRead = new InstanceExample(this.instances.instance(0));
        this.instances.delete(); // keep instances clean
        return true;
      }
      if (this.fileReader != null) {
        this.fileReader.close();
        this.fileReader = null;
      }
      return false;
    } catch (IOException ioe) {
      throw new RuntimeException(
          "ArffFileStream failed to read instance from stream.", ioe);
    }

  }

  @Override
  protected InstanceExample getLastInstanceRead() {
    return this.lastInstanceRead;
  }

  /*
   * extend org.apache.samoa.moa.MOAObject
   */
  @Override
  public void getDescription(StringBuilder sb, int indent) {
    // TODO Auto-generated method stub
  }
}
