package uy.edu.udelar.forrest.forrestloganalyser;

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

import uy.edu.udelar.forrest.forrestloganalyser.app.CargarCubos;
import uy.edu.udelar.forrest.forrestloganalyser.app.ProcesadorIndicadores;
import uy.edu.udelar.forrest.forrestloganalyser.app.ProcesadorLogs;
import uy.edu.udelar.forrest.forrestloganalyser.exceptions.DataBaseConnectionException;
import uy.edu.udelar.forrest.forrestloganalyser.exceptions.MainModelCreateContextException;
import uy.edu.udelar.forrest.forrestloganalyser.exceptions.ProcesarIndicadoresException;
import uy.edu.udelar.forrest.forrestloganalyser.exceptions.ProcesarLogsException;
import uy.edu.udelar.forrest.forrestloganalyser.model.MainModel;

public class Main {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    	String nombreArchivoLog, nombreArchivoContexto, locatario, visitante;
		String sqlSentence = "";
        Statement stmt;
        Connection connection;
    	int idPartido = 0;
        try{
        	nombreArchivoContexto = args[0];
        	nombreArchivoLog = args[1];
        	locatario = args[2];
        	visitante = args[3];
        	MainModel.createInitialContext(nombreArchivoContexto);
        	MainModel.setIdPartido();
        	MainModel.setLocatario(locatario);
        	MainModel.setVisitante(visitante);
        	MainModel.setCantFinPartido(0);
        	connection = MainModel.getDataBase().getConnection();
	        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){}
	        }
        	File f = new File(nombreArchivoLog);
        	String [] dir = f.list();
        	for ( int i=0; i< dir.length; i++){
        		StringTokenizer st = new StringTokenizer(dir[i],".");
        		st.nextToken();
        		if (st.hasMoreTokens()){
            		String ext = st.nextToken(); 
            		if ( ext.equalsIgnoreCase("log") ){
                        MainModel.getLogger().logInfo("Main::main - Comienza el Proceso del Archivo "+nombreArchivoLog+"/"+dir[i]);
                    	ProcesadorLogs pl = new ProcesadorLogs(nombreArchivoLog+"/"+dir[i]);
                    	pl.procesar();
            		}else if (ext.equalsIgnoreCase("kpi")){
                        MainModel.getLogger().logInfo("Main::main - Comienza el Proceso del Archivo "+nombreArchivoLog+"/"+dir[i]);
            			ProcesadorIndicadores pi = new ProcesadorIndicadores(nombreArchivoLog+"/"+dir[i]);
            			pi.procesar();
            		}
        		}
        	}

        	MainModel.getLogger().logInfo("Main::main - Comienza la Carga del Cubo");
        	CargarCubos cc = new CargarCubos();
        	cc.procesar();
            MainModel.getLogger().logInfo("Main::main - Finalizo la carga correctamente");
        
        }catch (ProcesarLogsException e){
            MainModel.getLogger().logError("Main::main - Error al procesar el log - "+e.getMessage());
        }catch (ProcesarIndicadoresException e){
            MainModel.getLogger().logError("Main::main - Error al procesar el log - "+e.getMessage());
        }catch (DataBaseConnectionException e){
            System.out.println("Main::main - Error al conectarse a la bd - "+e.getMessage());
        }catch (MainModelCreateContextException e){
            System.out.println("Main::main - Error al cargar el contexto - "+e.getMessage());
        }
        
    }
}
