//package poo;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

//import poo.buscadores.BinarySearcher;
//import poo.buscadores.Buscador;
//import poo.buscadores.LinearSearcher;
//import poo.ordenadores.BubbleSorter;
//import poo.ordenadores.InsertionSorter;
//import poo.ordenadores.Ordenador;

public class Tarea1 {

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args){

		BubbleSorter bubble_sorter = new BubbleSorter();
		InsertionSorter insertion_sorter = new InsertionSorter();
		BinarySearcher binary_searcher = new BinarySearcher();
		LinearSearcher linear_searcher = new LinearSearcher();


		/* LEER ARCHIVO */
		int num_lineas = getNumeroLineas(archivo);
		System.out.println("ARCHIVO DE : " + num_lineas + " LINEAS"); 
		Estudiante[] lista_archivo =  leerArchivo(archivo,num_lineas);
		showLista(lista_archivo);

		
		
		/* ORDENANDO CON BUBBLE SORTER  */
		Estudiante[] temp_bubble = lista_archivo.clone();
		computarParte1(bubble_sorter, temp_bubble);

		/* ORDENANDO CON INSERTION SORTER */
		Estudiante[] temp_insetion = lista_archivo.clone();
		computarParte1(insertion_sorter,temp_insetion);


	
		
		/* ELEGIOMOS UN ESTUDIANTE 
		 * Elegimos un estudiante de (N/2)-1
		  */
		Estudiante temp = null;
		if(lista_archivo.length>1)
			for(int i = 0; i < lista_archivo.length; i++)
				for(int j = 0; j < lista_archivo.length; j++)
					if(i==j-1)
						temp = lista_archivo[i];

		/* BUSCAMOS UN ESTUDIANTE */
		System.out.println("BUSCANDO: " + temp); 
		computarParte2(linear_searcher,lista_archivo,temp);
		computarParte2(binary_searcher,temp_bubble,temp);
	}






	/**
	 * Metodo que obtiene una nota aleatoreamente.
	 * @return Nota aleatoria entre 55 y 100
	 */
	private static int getNota(){
		Random r = new Random();
		int nota = r.nextInt();
		nota = Math.abs(nota);
		nota = nota % 45;
		nota += 55;
		return nota;
	}


	/**
	 * 
	 * @param archivo Nombre del archivo de entrada con los nombre de los alumnos.
	 * @param numero  Largo del Archivo.
	 * @return Estudiante[] Arreglo de objetos Estudiante.
	 */
	private static Estudiante[] leerArchivo(String archivo, int numero){
		Estudiante[] estudiantes = new Estudiante[numero];


		try {
			FileInputStream fstream = new FileInputStream(archivo);
			DataInputStream in = new DataInputStream(fstream);
			BufferedReader br = new BufferedReader(new InputStreamReader(in));
			String strLine;

			int i = 0;
			while ((strLine = br.readLine()) != null)   {
				estudiantes[i] = new Estudiante(strLine,getNota());
				i++;
			}

			in.close();
		} catch (FileNotFoundException e) {
			System.err.println("ERROR: El sistema no puede hallar el archivo " + archivo);
			e.printStackTrace();
			System.exit(0);

		} catch (IOException e) {
			System.err.println("ERROR: De lectura del archivo " + archivo);
			e.printStackTrace();
			System.exit(0);
		}

		return estudiantes;
	}
	/** Obtiene el número de lienas que posee el archivo y capturas posibles excepciones.
	 * @return número de lineas del archivo
	 */
	private static int getNumeroLineas(String archivo){
		int num_lineas = 0;
		try {
			FileInputStream fstream = new FileInputStream(archivo);
			DataInputStream in = new DataInputStream(fstream);
			BufferedReader br = new BufferedReader(new InputStreamReader(in));


			while ((br.readLine()) != null)   {
				num_lineas++;
			}

			in.close();
		} catch (FileNotFoundException e) {
			System.err.println("ERROR: El sistema no puede hallar el archivo " + archivo );
			e.printStackTrace();
			System.exit(0);

		} catch (IOException e) {
			System.err.println("ERROR: De lectura del archivo " + archivo);
			e.printStackTrace();
			System.exit(0);
		}

		return num_lineas;
	}

	/**
	 * 
	 * @param Ordenador 
	 * @param Arreglo de Estudiantes
	 */
	public static void computarParte1(Ordenador ordenador, Estudiante[] lista){
		System.out.println(ordenador);
		ordenador.ordenar(lista);
		System.out.print("NUMERO COMPARACIONES:\t"+ ordenador.getNumComparaciones()+ "\n");
		System.out.print("NUMERO INTERCAMBIOS :\t"+ ordenador.getNumIntercambios()+ "\n");
		showLista(lista);

	}
	
	/**
	 * @param Buscador
	 * @param Lista de Estudiantes
	 * @param Alumno a Buscar
	 */
	public static void computarParte2(Buscador buscador, Estudiante[] lista, Estudiante perdido){
		int posicion = buscador.buscar(lista,perdido);
		System.out.println("\n" + buscador);
		System.out.println("COMPARACIONES:" + buscador.getNumComparaciones());	
		System.out.println("ENCONTRADO   :" + lista[posicion]);
	}

	/**
	 * @param Lista
	 */
	public static void showLista(Estudiante[] lista){
		for (int i=0; i<lista.length; i++) 
			System.out.println(lista[i]);
		System.out.println();
	}

	private static final String archivo = "listaNombres.txt" ;

}
