/*
 * 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 opennlp.tools.disambiguator.ims;

import java.io.File;
import java.security.InvalidParameterException;

import opennlp.tools.disambiguator.WSDParameters;

/**
 * This class contains the parameters for the IMS approach as well as the
 * directories containing the files used
 */
public class IMSParameters extends WSDParameters {

  protected String languageCode;
  protected int windowSize;
  protected int ngram;

  protected String trainingDataDirectory;
  
  protected static final int DFLT_WIN_SIZE = 3;
  protected static final int DFLT_NGRAM = 2;
  protected static final String DFLT_LANG_CODE = "En";
  protected static final SenseSource DFLT_SOURCE = SenseSource.WORDNET;

  /**
   * This constructor takes only two parameters. The default language used is
   * <i>English</i>
   * 
   * @param windowSize
   *          the size of the window used for the extraction of the features
   *          qualified of Surrounding Words
   * @param ngram
   *          the number words used for the extraction of features qualified of
   *          Local Collocations
   * @param source
   *          the source of the training data
   */
  public IMSParameters(int windowSize, int ngram, SenseSource senseSource,
      String trainingDataDirectory){
   
    this.languageCode = DFLT_LANG_CODE;
    this.windowSize = windowSize;
    this.ngram = ngram;
    this.senseSource = senseSource;
    this.trainingDataDirectory = trainingDataDirectory;

    File folder = new File(trainingDataDirectory);
    if (!folder.exists())
      folder.mkdirs();
  }

  public IMSParameters(String trainingDataDirectory) {
    this(DFLT_WIN_SIZE, DFLT_NGRAM, DFLT_SOURCE, trainingDataDirectory);
  }

  public String getLanguageCode() {
    return languageCode;
  }

  public void setLanguageCode(String languageCode) {
    this.languageCode = languageCode;
  }

  public int getWindowSize() {
    return windowSize;
  }

  public void setWindowSize(int windowSize) {
    this.windowSize = windowSize;
  }

  public int getNgram() {
    return ngram;
  }

  public void setNgram(int ngram) {
    this.ngram = ngram;
  }

  void init() {
  }

  /**
   * Creates the context generator of IMS
   */
  public IMSContextGenerator createContextGenerator() {
    return new DefaultIMSContextGenerator();
  }

  public String getTrainingDataDirectory() {
    return trainingDataDirectory;
  }

  public void setTrainingDataDirectory(String trainingDataDirectory) {
    this.trainingDataDirectory = trainingDataDirectory;
  }

  @Override
  public boolean isValid() {
    // TODO recheck this pattern switch to maps
    return true;
  }

}
