/**
 * 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.mahout.ga.watchmaker.cd.tool;

import com.google.common.base.Preconditions;

/**
 * Used as a configuration Parameters for the mapper-combiner-reducer<br>
 * CDTOOL.ATTRIBUTES : char[] description of the attributes.<br>
 * for each attribute, takes one of this values:<br>
 * <ul>
 * <li>N : numerical attribute</li>
 * <li>C : categorical (nominal) attribute</li>
 * <li>L : label (nominal) attribute</li>
 * <li>I : ignored attribute</li>
 * </ul>
 * 
 */
public final class Descriptors {
  
  private final char[] descriptors;
  
  public Descriptors(char[] descriptors) {
    Preconditions.checkArgument(descriptors != null && descriptors.length > 0, "descriptors null or empty");
    this.descriptors = descriptors;
    // check that all the descriptors are correct ('I', 'N' 'L' or 'C')
    for (int index = 0; index < descriptors.length; index++) {
      Preconditions.checkArgument(isIgnored(index) || isNumerical(index) || isNominal(index),
          "Bad descriptor value", descriptors[index]);
    }
  }
  
  public boolean isIgnored(int index) {
    return descriptors[index] == 'i' || descriptors[index] == 'I';
  }
  
  public boolean isNumerical(int index) {
    return descriptors[index] == 'n' || descriptors[index] == 'N';
  }
  
  public boolean isNominal(int index) {
    return descriptors[index] == 'c' || descriptors[index] == 'C' || isLabel(index);
  }
  
  public boolean isLabel(int index) {
    return descriptors[index] == 'l' || descriptors[index] == 'L';
  }
  
  public int size() {
    return descriptors.length;
  }
  
  public char[] getChars() {
    return descriptors;
  }
}
