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

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.StringTokenizer;

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

public class ProcesadorLogs {

	private String nombreArchivo;
	
	public ProcesadorLogs(String nomArch){
		nombreArchivo = nomArch;
	}
	
	public void procesar() throws DataBaseConnectionException, ProcesarLogsException {
		String linea = "";
		String marca = "";
		int golesLocatario = 0, golesVisitante = 0;
        Connection connection = MainModel.getDataBase().getConnection();
        try{
            BufferedReader r = new BufferedReader(new FileReader(nombreArchivo));
            try {
                int cant=0;
                while ((linea = r.readLine()) != null) {
                    cant++;
                    MainModel.getLogger().logInfo("ProcesadorLogs::procesar - Procesando registro "+cant);
                    MainModel.getLogger().logDebug("ProcesadorLogs::procesar - Linea "+linea);
                    StringTokenizer st = new StringTokenizer(linea,":");
                    marca = st.nextToken();
                    marca = st.nextToken();
                    if (marca.trim().equalsIgnoreCase("TLog")){
                    	//Estoy procesano una entrada valida
                    	marca = st.nextToken();
                    	if (marca.trim().equalsIgnoreCase("ACCION")){
                    		//Se trata de una accion del jugador
                    		ProcesadorAcciones pa = new ProcesadorAcciones(linea);
                    		pa.procesar();
                    	} else if (marca.trim().equalsIgnoreCase("GOL")){
                    		marca = st.nextToken();
                    		marca = st.nextToken();
                    		if (marca.trim().equals("OTRO")){
                    			golesVisitante += 1;
                    		}else{
                    			golesLocatario += 1;
                    		}
                    	}else{
                    		ProcesadorPartido pp = new ProcesadorPartido(linea);
                    		pp.procesar();
                    	}
                    }
                }
    	        try{
    	        	String sqlSentence = "";
    	        	if (MainModel.getCantFinPartido() != 10){
    	        		sqlSentence="update partidos set finalizado_ok = 'f' where id_partido="+MainModel.getIdPartido();	
    	        	}else{
    	        		sqlSentence="update partidos set finalizado_ok = 't' where id_partido="+MainModel.getIdPartido();
    	        	}
    	            MainModel.getLogger().logDebug("ProcesadorLogs::procesar - Voy a ejecutar la sentencia: "+sqlSentence);
    	            Statement stmt = connection.createStatement();
    	            stmt.executeUpdate(sqlSentence);
    	            connection.commit();
    	        }catch (SQLException e){
    	            try{
    	                connection.rollback();
    	            }catch (Exception e1){}
    	            	
    	        }

            }catch (IOException ei){
                throw new ProcesarLogsException("ProcesadorLogs::procesar - Error al procesar el log, error: "+ei.getMessage());
            }
        }catch (FileNotFoundException ef){
            throw new ProcesarLogsException("ProcesadorLogs::procesar - No se ha encontrado el archivo "+nombreArchivo);
        }
	}
}
