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

import java.util.ArrayList;
import java.util.List;
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.ProcesarIndicadoresException;
import uy.edu.udelar.forrest.forrestloganalyser.model.MainModel;

public class ProcesadorIndicadores {

	private String nombreArchivo;

	public ProcesadorIndicadores(String nomArch) {
		nombreArchivo = nomArch;
	}

	public void procesar() throws DataBaseConnectionException,
			ProcesarIndicadoresException {
		String linea = "";
		String nombreVar = "";
		String sqlSentence = "";
		String valor = "";
		String modificador = "";
		List varACargar = getVariablesACargar();
		Statement stmt;
		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);
					StringTokenizer st = new StringTokenizer(linea, " ");
					nombreVar = st.nextToken();
					if (varACargar.contains(nombreVar)) {
						if (nombreVar.substring(0, 2).equalsIgnoreCase("Pl")
								|| nombreVar.substring(0, 1).equalsIgnoreCase(
										"T")) {
							// Estoy hablando de estadisticas de players o teams
							try {
								modificador = st.nextToken();
								valor = st.nextToken();
								sqlSentence = "insert into indicadores(identificador,id_partido,nombre_var,modificador,valor) values ("
										+ cant
										+ ","
										+ MainModel.getIdPartido()
										+ ",'"
										+ nombreVar
										+ "','"
										+ modificador + "'," + valor + ");";
								MainModel.getLogger().logDebug(
										"ProcesadorIndicadores::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 ProcesarIndicadoresException(
										"ProcesadorIndicadores::procesar - Error al ejecutar la consulta: "
												+ sqlSentence);
							}
						} else {
							try {
								valor = st.nextToken();
								sqlSentence = "insert into indicadores(identificador,id_partido,nombre_var,valor) values ("
										+ cant
										+ ","
										+ MainModel.getIdPartido()
										+ ",'"
										+ nombreVar
										+ "',"
										+ valor
										+ ");";
								MainModel.getLogger().logDebug(
										"ProcesadorIndicadores::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 ProcesarIndicadoresException(
										"ProcesadorIndicadores::procesar - Error al ejecutar la consulta: "
												+ sqlSentence);
							}
						}
					}
				}
			} catch (IOException ei) {
				throw new ProcesarIndicadoresException(
						"ProcesadorIndicadores::procesar - Error al procesar el log, error: "
								+ ei.getMessage());
			}
		} catch (FileNotFoundException ef) {
			throw new ProcesarIndicadoresException(
					"ProcesadorIndicadores::procesar - No se ha encontrado el archivo "
							+ nombreArchivo);
		}
	}

	private List getVariablesACargar() throws ProcesarIndicadoresException {
		List l = new ArrayList();
		String linea = "";
		try {
			BufferedReader r = new BufferedReader(new FileReader("cfg/kpis.cfg"));
			while ((linea = r.readLine()) != null) {
				l.add(linea);
			}
		} catch (FileNotFoundException e) {
			throw new ProcesarIndicadoresException(
					"ProcesadorIndicadores::procesar - Error al procesar el log, error: "
							+ e.getMessage());
		} catch (IOException e) {
			throw new ProcesarIndicadoresException(
					"ProcesadorIndicadores::procesar - Error al procesar el log, error: "
							+ e.getMessage());
		}
		return l;
	}
}
