package fipm.data.queryfeatures.situation;

import java.util.ArrayList;
import java.util.List;

import de.tum.in.fipm.base.data.Signature;
import de.tum.in.fipm.base.data.feature.QueryFeature;

import fipm.data.queryfeatures.FeatureUtil;



public class DefendersToGoal extends QueryFeature {
	
	private static List<Signature> inputSemantics = new ArrayList<Signature>(1);
	private static List<Signature> outputSemantics = new ArrayList<Signature>(3);
	
	static {
		inputSemantics.add(new Signature("analyzed_player", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
		inputSemantics.add(new Signature("player", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
		inputSemantics.add(new Signature("x_player", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
		inputSemantics.add(new Signature("y_player", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
		inputSemantics.add(new Signature("x_goal", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
		
		outputSemantics.add(new Signature("player", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
		outputSemantics.add(new Signature("num_defenders", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
		outputSemantics.add(new Signature("group", Signature.Necessity.MUST, "FLOAT", "owl:thing"));
	}
	
	{
	    name="DefendersToGoal";
	}

	@Override
	public void calculate() {
		
		/*
		 * Initialisieren der Ausgabe
		 */
		this.initOutputData();
		
		/*
		 * Bearbeiten der Eingabedaten
		 */
		int numGroups = this.getNumGroups("analyzed_player");
		int outputIndex = 0;
		
		for (int i = 0; i < numGroups; i++) {
			
			int numRows = this.getNumRows("player", i);
			
			double xGoal = Double.parseDouble(this.getValue("x_goal", i, 0).toString());
			
			int[] id = new int[numRows];
			double[] x = new double[numRows];
			double[] y = new double[numRows];
			int analyzedPlayer = 0;
			
			for (int j = 0; j < numRows; j++) {
				id[j] = Integer.parseInt(this.getValue("player", i, j).toString());
				x[j] = Double.parseDouble(this.getValue("x_player", i, j).toString());
				y[j] = Double.parseDouble(this.getValue("y_player", i, j).toString());
				if (Integer.parseInt(this.getValue("analyzed_player", i, 0).toString()) == id[j]) {
					analyzedPlayer = j;
				}
			}
			
			for (int j = 0; j < numRows; j++) {
				
				if (FeatureUtil.isDefender(id[j], id[analyzedPlayer])) {
					continue;
				}
				
				double distance = Math.abs(xGoal - x[j]);
				int numDefenders = 0;
				
				for (int k = 0; k < numRows; k++) {
					if (FeatureUtil.isDefender(id[k], id[analyzedPlayer])) {
						if (FeatureUtil.distance2D(x[k], y[k], xGoal, 0) < distance) {
							numDefenders++;
						}
					}
				}
				
				this.outputData.addRow(-1);
				this.outputData.setValueAt(String.valueOf(id[j]), outputIndex, 0);
				this.outputData.setValueAt(String.valueOf(numDefenders), outputIndex, 1);
				this.outputData.setValueAt(String.valueOf(i), outputIndex, 2);
				outputIndex++;
			}
		}
	}

	@Override
	public List<Signature> getInputSemantics() {
		return DefendersToGoal.inputSemantics;
	}

	@Override
	public List<Signature> getOutputSemantics() {
		return DefendersToGoal.outputSemantics;
	}

}
