package uy.edu.udelar.forrest.forrestloganalyser.app;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.StringTokenizer;

import uy.edu.udelar.forrest.forrestloganalyser.exceptions.ProcesarLogsException;
import uy.edu.udelar.forrest.forrestloganalyser.model.MainModel;

public class ProcesadorAcciones {

	private String linea;
	
	public ProcesadorAcciones(String l){
		linea = l;
	}
	
	public void procesar() throws ProcesarLogsException{
		String sqlSentence = "";
        Statement stmt;
        Connection connection = MainModel.getDataBase().getConnection();
        int nroAgente, ciclo, agenteReceptor, dirPase, tipoPase;
        boolean agenteEjecuta;
        String accion, marca;
        float distScore, angScore;
        try{
    		StringTokenizer st = new StringTokenizer(linea,":");
    		ciclo = Integer.parseInt(st.nextToken().trim());
    		marca = st.nextToken();
    		marca = st.nextToken().trim();
    		if (marca.equalsIgnoreCase("ACCION")){
    			marca = st.nextToken().trim();
    			agenteEjecuta = st.nextToken().trim().equalsIgnoreCase("1");
    			marca = st.nextToken().trim();
    			nroAgente = Integer.parseInt(st.nextToken().trim())-60;
    			marca = st.nextToken().trim();
    			accion = st.nextToken().trim();
    			if (accion.equalsIgnoreCase("INTERCEPT")){
    		        try{
    		            sqlSentence="insert into acciones_intercept(id_partido,ciclo,nro_agente,ejecuto) values ("+MainModel.getIdPartido()+","+ciclo+","+nroAgente+","+agenteEjecuta+");";
    		            MainModel.getLogger().logDebug("ProcesadorAcciones::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    		            stmt = connection.createStatement();
    		            stmt.executeUpdate(sqlSentence);
    		            connection.commit();
    		        }catch (SQLException e){
    		            try{
    		                connection.rollback();
    		            }catch (Exception e1){}
    		            throw new ProcesarLogsException("ProcesadorAcciones::procesar - Error al ejecutar la consulta: "+sqlSentence);
    		        }
    			} else if (accion.equalsIgnoreCase("PASSTO")){
    		        try{
    					marca = st.nextToken();
    					agenteReceptor = Integer.parseInt(st.nextToken().trim())-60;
    					marca = st.nextToken();
    					dirPase = Integer.parseInt(st.nextToken().trim());
    					marca = st.nextToken();
    					tipoPase = Integer.parseInt(st.nextToken().trim());
    		            sqlSentence="insert into acciones_passto(id_partido,ciclo,nro_agente,nro_agente_receptor,direccion,tipo,ejecuto) values ("+MainModel.getIdPartido()+","+ciclo+","+nroAgente+","+agenteReceptor+","+dirPase+","+tipoPase+","+agenteEjecuta+");";
    		            MainModel.getLogger().logDebug("ProcesadorAcciones::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    		            stmt = connection.createStatement();
    		            stmt.executeUpdate(sqlSentence);
    		            connection.commit();
    		        }catch (SQLException e){
    		            try{
    		                connection.rollback();
    		            }catch (Exception e1){}
    		            throw new ProcesarLogsException("ProcesadorAcciones::procesar - Error al ejecutar la consulta: "+sqlSentence);
    		        }
    			} else if (accion.equalsIgnoreCase("DRIBBLE")){
    		        try{
    					marca = st.nextToken();
    					dirPase = Integer.parseInt(st.nextToken().trim());
    					marca = st.nextToken();
    					tipoPase = Integer.parseInt(st.nextToken().trim());
    		            sqlSentence="insert into acciones_dribble(id_partido,ciclo,direccion,tipo,nro_agente,ejecuto) values ("+MainModel.getIdPartido()+","+ciclo+","+dirPase+","+tipoPase+","+nroAgente+","+agenteEjecuta+");";
    		            MainModel.getLogger().logDebug("ProcesadorAcciones::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    		            stmt = connection.createStatement();
    		            stmt.executeUpdate(sqlSentence);
    		            connection.commit();
    		        }catch (SQLException e){
    		            try{
    		                connection.rollback();
    		            }catch (Exception e1){}
    		            throw new ProcesarLogsException("ProcesadorAcciones::procesar - Error al ejecutar la consulta: "+sqlSentence);
    		        }
    			} else if (accion.equalsIgnoreCase("CLEARBALL")){
    		        try{
    					marca = st.nextToken();
    					tipoPase = Integer.parseInt(st.nextToken().trim());
    		            sqlSentence="insert into acciones_clearball(id_partido,ciclo,nro_agente,tipo,ejecuto) values ("+MainModel.getIdPartido()+","+ciclo+","+nroAgente+","+tipoPase+","+agenteEjecuta+");";
    		            MainModel.getLogger().logDebug("ProcesadorAcciones::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    		            stmt = connection.createStatement();
    		            stmt.executeUpdate(sqlSentence);
    		            connection.commit();
    		        }catch (SQLException e){
    		            try{
    		                connection.rollback();
    		            }catch (Exception e1){}
    		            throw new ProcesarLogsException("ProcesadorAcciones::procesar - Error al ejecutar la consulta: "+sqlSentence);
    		        }
    			} else if (accion.equalsIgnoreCase("MOVETO")){
    		        try{
    					marca = st.nextToken();
    					dirPase = Integer.parseInt(st.nextToken().trim());
    		            sqlSentence="insert into acciones_moveto(id_partido,ciclo,nro_agente,direccion,ejecuto) values ("+MainModel.getIdPartido()+","+ciclo+","+nroAgente+","+dirPase+","+agenteEjecuta+");";
    		            MainModel.getLogger().logDebug("ProcesadorAcciones::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    		            stmt = connection.createStatement();
    		            stmt.executeUpdate(sqlSentence);
    		            connection.commit();
    		        }catch (SQLException e){
    		            try{
    		                connection.rollback();
    		            }catch (Exception e1){}
    		            throw new ProcesarLogsException("ProcesadorAcciones::procesar - Error al ejecutar la consulta: "+sqlSentence);
    		        }
    			} else if (accion.equalsIgnoreCase("MOVEPOSEST")){
    		        try{
    					marca = st.nextToken();
    					agenteReceptor = Integer.parseInt(st.nextToken().trim())-60;
    					marca = st.nextToken();
    					agenteEjecuta = st.nextToken().trim().equalsIgnoreCase("1");
    		            sqlSentence="insert into acciones_moveposest(id_partido,ciclo,nro_agente,ejecuto) values ("+MainModel.getIdPartido()+","+ciclo+","+nroAgente+","+agenteEjecuta+");";
    		            MainModel.getLogger().logDebug("ProcesadorAcciones::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    		            stmt = connection.createStatement();
    		            stmt.executeUpdate(sqlSentence);
    		            connection.commit();
    		        }catch (SQLException e){
    		            try{
    		                connection.rollback();
    		            }catch (Exception e1){}
    		            throw new ProcesarLogsException("ProcesadorAcciones::procesar - Error al ejecutar la consulta: "+sqlSentence);
    		        }
    			} else if (accion.equalsIgnoreCase("SCORE")){
    		        try{
    					marca = st.nextToken();
    					angScore = Float.parseFloat(st.nextToken().trim());
    		            sqlSentence="insert into acciones_score(id_partido,ciclo,nro_agente,angulo,ejecuto) values ("+MainModel.getIdPartido()+","+ciclo+","+nroAgente+","+angScore+","+agenteEjecuta+");";
    		            MainModel.getLogger().logDebug("ProcesadorAcciones::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    		            stmt = connection.createStatement();
    		            stmt.executeUpdate(sqlSentence);
    		            connection.commit();
    		        }catch (SQLException e){
    		            try{
    		                connection.rollback();
    		            }catch (Exception e1){}
    		            throw new ProcesarLogsException("ProcesadorAcciones::procesar - Error al ejecutar la consulta: "+sqlSentence);
    		        }
    			}
    		}
        }catch (Exception e){
            MainModel.getLogger().logError("ProcesadorAcciones::procesar - Se produjo un error al procesar la linea: "+linea);
        }
	}
}
