//package poo;


import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;

//import LinearSearcher;
//import BubbleSorter;
/**
 * clase que extiende de Jframe e implementa Actionlistener.
 */
public class JFrameTarea2 extends JFrame implements ActionListener{

	/**
	 * clase que crea un panel con un menu y dos jmutablepanel donde utilizando jfileshooser se puede seleccionar el archivo a utilizar.
	 */
	private static final long serialVersionUID = 2284811612927213785L;
	/**
	 * Hace visible e inicializa la interface grafica.
	 */
	public JFrameTarea2(){	
		initUI();
		setLocationRelativeTo(null); 
		setVisible(true);
	}
	/**
	 * Inicializa el Menu.
	 */
	void initUI(){			
		configFrame();
		addMenu();
		addMainPanel();
	}
	/**
	 * Configura el frame principal.
	 */
	void configFrame(){		
		setTitle("Tarea N° 2 -  OOP");
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}
	/**
	 * Crea las secciones del Frame.
	 */
	void addMainPanel(){	
		panel.setLayout(new GridLayout(1, 2));
		panel.add(new JScrollPane(lista_normal));
		panel.add(new JScrollPane(lista_random));
		add(panel);
	}

	/**
	 * Se configura las acciones realizadas por las opciones del menu.
	 */

	void addItem(JMenu menu, String label, int cod_action){		
		JMenuItem abrirItem = new JMenuItem(label);
		abrirItem.setActionCommand(Integer.toString(cod_action));
		abrirItem.addActionListener(this);	
		menu.add(abrirItem);
	}
	/**
	 * Se crean las opciones del menu.
	 */
	void addMenu(){	

		JMenu fileMenu = new JMenu("Archivo");
		addItem(fileMenu,"abrir",COD_ABRIR);
		addItem(fileMenu,"terminar",COD_TERMINAR);

		JMenu actionMenu = new JMenu("Áccion");
		addItem(actionMenu,"rodar", COD_RODAR);
		addItem(actionMenu,"buscar",COD_BUSCAR);

		JMenu aboutMenu = new JMenu("About");
		addItem(aboutMenu,"About", COD_ABOUT);

		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		menuBar.add(fileMenu);
		menuBar.add(actionMenu);
		menuBar.add(aboutMenu);
	}
	/**
	 * Metodo que configura las acciones que se realizaran al presionar cada opcion del menu.
	 */
	public void actionPerformed(ActionEvent action) {		
		int cod_action =  Integer.parseInt(action.getActionCommand());

		switch(cod_action){

		case COD_ABRIR:			//Mediante el selector de archivos de java se obtiene el archivo a utilizar.
			final int retval = fileChooser.showOpenDialog(this);
			if (retval == JFileChooser.APPROVE_OPTION) {
				File file = fileChooser.getSelectedFile();
				archivo = file.getAbsolutePath();
				lista_normal.limpiar();
				lista_normal.addArrayElements(leerArchivo(archivo));
				panel.revalidate();
			}
			break;


		case COD_TERMINAR:		//opcion para terminar la aplicacion.
			System.exit(0);
			break;


		case COD_RODAR:			//Rodar nos permite reordenar aleatoreamente la lista mostrandolo la en la lista derecha.
			lista_random.limpiar();
			BubbleSorter bubble_sorter = new BubbleSorter();
			Estudiante[] estudiantes_random = leerArchivo(archivo);
			bubble_sorter.ordenar(estudiantes_random);
			lista_random.addArrayElements(estudiantes_random);
			panel.revalidate();
			break;



		case COD_BUSCAR:		//Esta opcion nos permite buscar un nombre espesifico en la lista que ha sido ordenada aleatoreamente.
			if(archivo!= null){
				Estudiante[] estudiantes = leerArchivo(archivo);
				LinearSearcher buscador = new LinearSearcher();
				String str = JOptionPane.showInputDialog(null, "Ingresar Nombre o Apellido: ", "Buscador", 1);
				if(str != null )
					lista_normal.setSelectedIndices(buscador.match(estudiantes, str));
			}
			break;


		case COD_ABOUT:		//Desplega una ventana de dialogo que entrega informacion acerca del raqmoy autores de la tarea.
			new JDialogAbout(this);
			break;
		}

	}

	/**
	 * metodo que realiza el  ordenamiento aleatoreo de la lista de nombres.
	 */

	public void rodar(){		

	}


	/**
	 * 
	 * @param archivo Nombre del archivo de entrada con los nombre de los alumnos.
	 * @param numero  Largo del Archivo.
	 * @return Estudiante[] Arreglo de objetos Estudiante.
	 */
	public Estudiante[] leerArchivo(String archivo){		//
		int numero_lineas = getNumeroLineas(archivo);

		Estudiante[] estudiantes = new Estudiante[numero_lineas];


		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(numero_lineas));
				System.out.println(estudiantes[i] );
				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;
	}

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


	/** Obtiene el número de lienas que posee el archivo y capturas posibles excepciones.
	 * @return número de lineas del archivo
	 */
	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;
	}


	static final int DEFAULT_WIDTH = 600;
	static final int DEFAULT_HEIGHT = 400;

	static final int COD_ABRIR    = 100;
	static final int COD_TERMINAR = 101;
	static final int COD_RODAR    = 200;
	static final int COD_BUSCAR   = 201;
	static final int COD_ABOUT    = 300;

	JFileChooser fileChooser = new JFileChooser();
	JListMutable lista_normal = new JListMutable();
	JListMutable lista_random = new JListMutable();
	JPanel panel = new JPanel();
	String archivo = null;

}


