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 ProcesadorPartido {

	private String linea;
	
	public ProcesadorPartido(String l){
		linea = l;
	}
	
	public void procesar() throws ProcesarLogsException{
		String sqlSentence = "";
        Statement stmt;
        Connection connection = MainModel.getDataBase().getConnection();
        int golesEquipoDer, golesEquipoIzq, nroAgente;
        float posX, posY;
        String nombreEquipoDer, nombreEquipoIzq;
        try{
    		StringTokenizer st = new StringTokenizer(linea,":");
    		int ciclo = Integer.parseInt(st.nextToken().trim());
    		String marca = st.nextToken();
    		marca = st.nextToken().trim();
    		if (marca.equalsIgnoreCase("INICIO_PARTIDO")){
    			marca = st.nextToken().trim();
    			nombreEquipoIzq = st.nextToken().trim();
    			marca = st.nextToken().trim();
    			nombreEquipoDer = st.nextToken().trim();
    	        try{
    	            sqlSentence="insert into partidos(id_partido,fecha,locatario,visitante) values ("+MainModel.getIdPartido()+",current_date,'"+MainModel.getLocatario()+"','"+MainModel.getVisitante()+"');";
    	            MainModel.getLogger().logDebug("ProcesadorPartido::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    	            stmt = connection.createStatement();
    	            stmt.executeUpdate(sqlSentence);
    	            connection.commit();
    	        }catch (SQLException e){
    	            try{
    	                connection.rollback();
    	            }catch (Exception e1){}
    	        }
    		} else if (marca.equalsIgnoreCase("FIN_PARTIDO")){
    			MainModel.setCantFinPartido(MainModel.getCantFinPartido()+1);
    			marca = st.nextToken().trim();
    			golesEquipoDer = Integer.parseInt(st.nextToken().trim());
    			marca = st.nextToken().trim();
    			golesEquipoIzq = Integer.parseInt(st.nextToken().trim());
    	        try{
    	            sqlSentence="update partidos set goles_locatario="+golesEquipoDer+", goles_visitante="+golesEquipoIzq+" where id_partido="+MainModel.getIdPartido();
    	            MainModel.getLogger().logDebug("ProcesadorPartido::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("Procesadorpartido::procesar - Error al ejecutar la consulta: "+sqlSentence);
    	        }
    		} else if (marca.equalsIgnoreCase("POS_PELOTA")){
    			marca = st.nextToken().trim();
    			posX = java.lang.Float.parseFloat(st.nextToken().trim());
    			marca = st.nextToken().trim();
    			posY = java.lang.Float.parseFloat(st.nextToken().trim());
    	        try{
    	            sqlSentence="insert into posicion_pelota(id_partido,ciclo,x,y) values ("+MainModel.getIdPartido()+","+ciclo+","+posX+","+posY+");";
    	            MainModel.getLogger().logDebug("ProcesadorPartido::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("Procesadorpartido::procesar - Error al ejecutar la consulta: "+sqlSentence);
    	        }
    		} else if (marca.equalsIgnoreCase("KICKABLE")){
    			marca = st.nextToken().trim();
    			nombreEquipoDer = st.nextToken().trim();
    			marca = st.nextToken().trim();
    			nroAgente = Integer.parseInt(st.nextToken().trim());
    	        try{
    	            sqlSentence="insert into jugador_pelota(id_partido,ciclo,equipo,agente) values ("+MainModel.getIdPartido()+","+ciclo+",'"+nombreEquipoDer+"',"+nroAgente+");";
    	            MainModel.getLogger().logDebug("ProcesadorPartido::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("Procesadorpartido::procesar - Error al ejecutar la consulta: "+sqlSentence);
    	        }
    		}
        }catch (Exception e){
            MainModel.getLogger().logError("ProcesadorPartido::procesar - Se produjo un error al procesar la linea: "+linea);
        }
	}
}
