/**
 * 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.hadoop.util;

import java.io.IOException;
import java.util.Arrays;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.serial.RawComparator;
import org.apache.hadoop.io.serial.Serialization;

/**
 * This class allows generic access to variable length type-safe parameter
 * lists.
 */
public class Options {

  public static abstract class StringOption {
    private final String value;
    protected StringOption(String value) {
      this.value = value;
    }
    public String getValue() {
      return value;
    }
  }

  public static abstract class ClassOption {
    private final Class<?> value;
    protected ClassOption(Class<?> value) {
      this.value = value;
    }
    public Class<?> getValue() {
      return value;
    }
  }

  public static abstract class BooleanOption {
    private final boolean value;
    protected BooleanOption(boolean value) {
      this.value = value;
    }
    public boolean getValue() {
      return value;
    }
  }

  public static abstract class IntegerOption {
    private final int value;
    protected IntegerOption(int value) {
      this.value = value;
    }
    public int getValue() {
      return value;
    }
  }

  public static abstract class LongOption {
    private final long value;
    protected LongOption(long value) {
      this.value = value;
    }
    public long getValue() {
      return value;
    }
  }

  public static abstract class SerializationOption {
    private final Serialization<?> value;
    protected SerializationOption(Serialization<?> value) {
      this.value = value;
    }
    public Serialization<?> getValue() {
      return value;
    }
  }
  
  public static abstract class PathOption {
    private final Path value;
    protected PathOption(Path value) {
      this.value = value;
    }
    public Path getValue() {
      return value;
    }
  }

  public static abstract class FSDataInputStreamOption {
    private final FSDataInputStream value;
    protected FSDataInputStreamOption(FSDataInputStream value) {
      this.value = value;
    }
    public FSDataInputStream getValue() {
      return value;
    }
  }

  public static abstract class FSDataOutputStreamOption {
    private final FSDataOutputStream value;
    protected FSDataOutputStreamOption(FSDataOutputStream value) {
      this.value = value;
    }
    public FSDataOutputStream getValue() {
      return value;
    }
  }

  public static abstract class ProgressableOption {
    private final Progressable value;
    protected ProgressableOption(Progressable value) {
      this.value = value;
    }
    public Progressable getValue() {
      return value;
    }
  }

  public static abstract class ComparatorOption {
    private final RawComparator value;
    protected ComparatorOption(RawComparator value) {
      this.value = value;
    }
    public RawComparator getValue() {
      return value;
    }
  }

  /**
   * Find the first option of the required class.
   * @param <T> the static class to find
   * @param <base> the parent class of the array
   * @param cls the dynamic class to find
   * @param opts the list of options to look through
   * @return the first option that matches
   * @throws IOException
   */
  @SuppressWarnings("unchecked")
  public static <base, T extends base> T getOption(Class<T> cls, base [] opts) {
    for(base o: opts) {
      if (o.getClass() == cls) {
        return (T) o;
      }
    }
    return null;
  }

  /**
   * Prepend some new options to the old options
   * @param <T> the type of options
   * @param oldOpts the old options
   * @param newOpts the new options
   * @return a new array of options
   */
  public static <T> T[] prependOptions(T[] oldOpts, T... newOpts) {
    // copy the new options to the front of the array
    T[] result = Arrays.copyOf(newOpts, newOpts.length+oldOpts.length);
    // now copy the old options
    System.arraycopy(oldOpts, 0, result, newOpts.length, oldOpts.length);
    return result;
  }
}
