package org.apache.samoa.instances;

/*
 * #%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%
 */

public class InstancesHeader extends Instances {

  private static final long serialVersionUID = 1L;

  public InstancesHeader(Instances i) {
    super(i, 0);
  }

  public InstancesHeader() {
    super();
  }

  public static String getClassNameString(InstancesHeader context) {
    if (context == null) {
      return "[class]";
    }
    return "[class:" + context.classAttribute().name() + "]";
  }

  public static String getClassLabelString(InstancesHeader context,
      int classLabelIndex) {
    if ((context == null) || (classLabelIndex >= context.numClasses())) {
      return "<class " + (classLabelIndex + 1) + ">";
    }
    return "<class " + (classLabelIndex + 1) + ":"
    + context.classAttribute().value(classLabelIndex) + ">";
  }

  // is impervious to class index changes - attIndex is true attribute index
  // regardless of class position
  public static String getAttributeNameString(InstancesHeader context,
      int attIndex) {
    if ((context == null) || (attIndex >= context.numAttributes())) {
      return "[att " + (attIndex + 1) + "]";
    }
    int instAttIndex = attIndex < context.classIndex() ? attIndex
        : attIndex + 1;
    return "[att " + (attIndex + 1) + ":"
    + context.attribute(instAttIndex).name() + "]";
  }

  public static String getInputAttributeNameString(InstancesHeader context,
      int attIndex) {
    if ((context == null) || (attIndex >= context.numInputAttributes())) {
      return "[att " + (attIndex + 1) + "]";
    }
    int instAttIndex = attIndex;
    return "[att " + (attIndex + 1) + ":"
    + context.inputAttribute(instAttIndex).name() + "]";
  }

  // is impervious to class index changes - attIndex is true attribute index
  // regardless of class position
  public static String getNominalValueString(InstancesHeader context,
      int attIndex, int valIndex) {
    if (context != null) {
      int instAttIndex = attIndex < context.classIndex() ? attIndex
          : attIndex + 1;
      if ((instAttIndex < context.numAttributes())
          && (valIndex < context.attribute(instAttIndex).numValues())) {
        return "{val " + (valIndex + 1) + ":"
            + context.attribute(instAttIndex).value(valIndex) + "}";
      }
    }
    return "{val " + (valIndex + 1) + "}";
  }

  // is impervious to class index changes - attIndex is true attribute index
  // regardless of class position
  public static String getNumericValueString(InstancesHeader context,
      int attIndex, double value) {
    if (context != null) {
      int instAttIndex = attIndex < context.classIndex() ? attIndex
          : attIndex + 1;
      if (instAttIndex < context.numAttributes()) {
        if (context.attribute(instAttIndex).isDate()) {
          return context.attribute(instAttIndex).formatDate(value);
        }
      }
    }
    return Double.toString(value);
  }

  public Attribute inputAttribute(int w) {
    return this.instanceInformation.inputAttribute(w);
  }

  public Attribute outputAttribute(int w) {
    return this.instanceInformation.outputAttribute(w);
  }

  public int numInputAttributes() {
    return this.instanceInformation.numInputAttributes();
  }

  public int numOutputAttributes() {
    return this.instanceInformation.numOutputAttributes();
  }

  public InstanceInformation getInstanceInformation() {
    return this.instanceInformation;
  }
}
