package equips;

import java.io.*;
import java.lang.Math;
import EDU.gatech.cc.is.util.Vec2;
import EDU.gatech.cc.is.abstractrobot.*;
import jess.*;

public class javajessw extends ControlSystemSS
{
	FileInputStream clp;
	int primeravez = 1;
	Rete jess_engine;
	Jesp parser;
	NullDisplay nd;
	int i;
	String cadena; 

	public void Configure()
	{
		try
		{
			clp=new FileInputStream("decisiow.clp");
	   	    	nd = new NullDisplay(); 
			jess_engine=new Rete(nd);
			parser=new Jesp(clp,jess_engine);				
		}
	       	
		catch (FileNotFoundException fnf) 
        	{
             	System.out.println("error fitxer no trobat");
        	}
		
		catch (IOException ioe) 
        	{
               	System.out.println("error excepcio");
        	} 
	}
		
	public int TakeStep()
	{
/*************************************************************************************/
/**************************Obtencio de dades******************************************/
/*************************************************************************************/
		
		// tiempo
		long	curr_time = abstract_robot.getTime();

		// mi posicion relativa al centro
		Vec2 jo_centro = abstract_robot.getPosition(curr_time);
	 
		// posicio de la pilota
		Vec2 ball = abstract_robot.getBall(curr_time);

	      // posicion de la porteria propia  
		Vec2 ourgoal = abstract_robot.getOurGoal(curr_time);

        	// posicion de la porteria contraria
		Vec2 theirgoal = abstract_robot.getOpponentsGoal(curr_time);

	    	// posicion de los del equipo 
		Vec2[] teammates = abstract_robot.getTeammates(curr_time);

       	// posicion de los contrarios
    		Vec2[] opponents = abstract_robot.getOpponents(curr_time);

		// número identificacion
		long numero = abstract_robot.getPlayerNumber(curr_time) + 1;

/*************************************************************************************/
/********************* Transformacio de coordenades (0,0) en esquina inf. izq.********/
/*************************************************************************************/
		// mi posicion 
        	Vec2 jo = new Vec2(0,0);
		jo.x = 1.37 + jo_centro.x;
		jo.y = 0.76 + jo_centro.y;
	
		// posicio de la pilota 
		ball.x = ball.x + jo.x;
		ball.y = ball.y + jo.y;
	
	      // posicion de la porteria propia  
		ourgoal.x = ourgoal.x + jo.x;
		ourgoal.y = ourgoal.y + jo.y;

        	// posicion de la porteria contraria
		theirgoal.x = theirgoal.x + jo.x;
		theirgoal.y = theirgoal.y + jo.y;

		// posicion de los companyeros
		if(teammates.length > 0)
      	{
			for(i = 0; i < teammates.length; i++)
			{
				teammates[i].x = teammates[i].x + jo.x;
				teammates[i].y = teammates[i].y + jo.y;
			}
		}

		// posicion de los contrarios
		if(opponents.length > 0)
      	{
			for(i = 0; i < opponents.length; i++)
			{
				opponents[i].x = opponents[i].x + jo.x;
				opponents[i].y = opponents[i].y + jo.y;

			}
		}
       
/*************************************************************************************/
/**************************Store de dades*********************************************/
/*************************************************************************************/
		try
		{ 		     		     
			jess_engine.store("x_pilota",new Value(ball.x, RU.FLOAT));
			jess_engine.store("y_pilota",new Value(ball.y, RU.FLOAT));
			jess_engine.store("x_jo",new Value(jo.x,RU.FLOAT));
			jess_engine.store("y_jo",new Value(jo.y,RU.FLOAT));
			jess_engine.store("x_porteria_propia",new Value(ourgoal.x, RU.FLOAT));
			jess_engine.store("y_porteria_propia",new Value(ourgoal.y, RU.FLOAT));
			jess_engine.store("x_porteria_contrari",new Value(theirgoal.x, RU.FLOAT));
			jess_engine.store("y_porteria_contrari",new Value(theirgoal.y, RU.FLOAT));
			jess_engine.store("numero_jugador",new Value(numero, RU.INTEGER));
 	
			if(teammates.length <= 0)
      	 	{
      	            jess_engine.store("x_company1",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_company1",new Value(0.0,RU.FLOAT));
      	            jess_engine.store("x_company2",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_company2",new Value(0.0,RU.FLOAT));
				jess_engine.store("x_company3",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_company3",new Value(0.0,RU.FLOAT));
            	    	jess_engine.store("x_company4",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_company4",new Value(0.0,RU.FLOAT));
			}
			else
			{
				for(i = 1; i < teammates.length+1; i++)
				{
					cadena = "x_company" + i;
				      jess_engine.store(cadena,new Value(teammates[i-1].x,RU.FLOAT));
					jess_engine.store(cadena,new Value(teammates[i-1].y,RU.FLOAT));
	     	       	}     	
			}

			if(opponents.length <= 0)
            	{
				jess_engine.store("x_contrari1",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_contrari1",new Value(0.0,RU.FLOAT));
				jess_engine.store("x_contrari2",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_contrari2",new Value(0.0,RU.FLOAT));
				jess_engine.store("x_contrari3",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_contrari3",new Value(0.0,RU.FLOAT));
				jess_engine.store("x_contrari4",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_contrari4",new Value(0.0,RU.FLOAT));
				jess_engine.store("x_contrari5",new Value(0.0,RU.FLOAT));
				jess_engine.store("y_contrari5",new Value(0.0,RU.FLOAT));
					
			}
			else
			{
				for(i = 1; i < opponents.length + 1; i++)
				{
					cadena = "x_contrari" + i;
                			jess_engine.store(cadena,new Value(opponents[i-1].x,RU.FLOAT));
					jess_engine.store(cadena,new Value(opponents[i-1].y,RU.FLOAT));
				}
			}

			if(primeravez==1)
			{
				do 
	            	{             
	      		      parser.parse(false); 
     	     		 	} 
				while (clp.available()>0); 		
				primeravez = 0;
			}
			else
			{
				jess_engine.executeCommand("(reset)");			
				jess_engine.executeCommand("(assert (fet obtenir_posicions))");
				jess_engine.executeCommand("(run)");
			}

/*************************************************************************************/
/**************************Fetch de dades*********************************************/
/*************************************************************************************/

		      Value x = jess_engine.fetch("coordx");
		      Value y = jess_engine.fetch("coordy");
			Value m = jess_engine.fetch("moure");
			Value k = jess_engine.fetch("xutar");

/*************************************************************************************/
/**************************Transformacio de coordenades (relatives al robot)**********/
/*************************************************************************************/
			Vec2 coord = new Vec2();
			coord.x = x.floatValue() - jo.x;
			coord.y = y.floatValue() - jo.y;	

			double t = Math.atan2(coord.y,coord.x);

/*************************************************************************************/
/**************************Execucio d'accions*****************************************/
/*************************************************************************************/

			//orientacio
			abstract_robot.setSteerHeading(curr_time,t);
			abstract_robot.setDisplayString("Orientant");
		
			//moviment
			abstract_robot.setSpeed(curr_time,m.intValue());
			abstract_robot.setDisplayString("Avançant");
		
			//xut
			if (k.intValue() == 1) 
				if (abstract_robot.canKick(curr_time))
					{
					 abstract_robot.kick(curr_time);
					 abstract_robot.setDisplayString("Xutant");
					}

		}		
		catch (ReteException re) 
      	{ 
               	re.printStackTrace(nd.stderr()); 
	      }

		catch (IOException ioe) 
	     	{
           		System.out.println("error excepcio a takestep");
	      }
		
		// tell the parent we're OK
		return(CSSTAT_OK);
	}
}
