package patternssearchingapi.algorithms;

import patternssearchingapi.options.AlgorithmOptionsPanel;
import cz.crishpean.utils.image.mask.similaritymask.SimilarityMask;
import java.awt.image.BufferedImage;
import java.util.prefs.Preferences;
import patternssearchingapi.options.AlgorithmOptions;

/**
 * Rozhrani pro vytvareni algoritmu urcujicich podobnost dvou masek.
 * 
 * @author Zora Horejsova
 */
public abstract class Algorithm implements Comparable<Algorithm>{
	public static final String UPPER_LIMIT_PROPERTY_NAME = "upperLimit";
	public static final String LOWER_LIMIT_PROPERTY_NAME = "lowerLimit";
	public static final String CUT_PRECOUNT_PROPERTY_NAME = "cutPrecount";
	public static final String PRIORITY_PROPERTY_NAME = "priority";
	public static final String IS_USED_PROPERTY_NAME = "isUsed";

    protected AlgorithmOptions options;
    protected AlgorithmOptionsPanel optionsPanel;

	/**
	 * Priorita pouzivana k razeni - cim nizsi tim dulezitejsi.
	 */
	protected String name = "";
	protected String info = "";

	//*******************************************************
	//	GETTER + SETTER
	//*******************************************************
	/**
	 * @return jmeno algoritmu
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return popis algoritmu
	 */
	public String getInfo() {
		return info;
	}
	
	/**
	 * @return GUI komponenta slouzici k nastaveni algoritmu uzivatelem
	 */
	public AlgorithmOptionsPanel getOptionsPanel() {
		return optionsPanel;
	}

	/**
	 * @return priorita algoritmu - pouziva se pri razeni
	 */
	public int getPriority() {
		return options.getInteger(PRIORITY_PROPERTY_NAME);
	}

	/**
	 * Nastavi priority algoritmu - pouziva se pri razeni.
	 * @param p
	 */
	public void setPriority(int p) {
		options.putProperty(PRIORITY_PROPERTY_NAME, p);
	}

	public boolean isIsUsed() {
		return options.getBoolean(IS_USED_PROPERTY_NAME);
	}

	public void setIsUsed(boolean isUsed) {
		options.putProperty(IS_USED_PROPERTY_NAME, isUsed);
	}

	//*******************************************************
	//
	//*******************************************************
	@Override
	public String toString() {
		return getName();
	}

	@Override
	public boolean equals(Object obj) {
		return getClass().getName().equals(obj.getClass().getName());
	}


	public int compareTo(Algorithm o) {
		return new Integer(o.getPriority()).compareTo(new Integer(getPriority()));
	}

	//*******************************************************
	//	ABSTRACT
	//*******************************************************
	/**
	 * @return aktualni nastaveni algoritmu
	 */
	abstract public String getOptionsInfo();
	/**
	 * @return trida reprezentujici algoritmus
	 */
	abstract public Class getAlgorithmClass();
	/**
	 * @param image obrazek z ktereho se ma vytvorit maska
	 * @return maska reprezentujici algoritmus
	 */
	abstract public SimilarityMask getAlgorithm(BufferedImage image);
	/**
	 * @param image obrazek z ktereho se ma vytvorit maska
	 * @return maska reprezentujici algoritmus
	 */
	abstract public SimilarityMask getAlgorithm(int[][] image);

	/**
	 * Ulozi nastaveni algoritmu do objektu pref.
	 * @param pref
	 */
	abstract public void saveAlgorithm(Preferences pref);

}
