/*
import java.util.Scanner;
import java.util.ArrayList;
*/
import java.util.*;
import java.io.*;

public class ListaSimple {
   /*
   Permite guardar la informacion dentro de la lista en un archivo
   para posteriormente recuperarla.
   */
   public void guardar(List<Integer> lista) {
      // Nuestro archivo donde guardaremos la informacion.
      FileWriter fichero = null;
      // Nuestro 'lapiz' que usaremos para escribir.
      PrintWriter pw = null;

      try {
         // Abrimos o creamos nuestro archivo.
         fichero = new FileWriter("./lista.txt");
         pw = new PrintWriter(fichero);
         /*
         for(int i = 0; i < lista.size(); i++){
         	pw.println(lista.get(i));
         }*/

         // Otra opcion de recorrer una lista. Se llama for-each
         // y podemos leerlo como: Para todo n en lista.
         for(int n : lista) {
            pw.println(n);
         }
      } catch (Exception e) {
         e.printStackTrace();
      } finally {
         try {
            // Nuevamente aprovechamos el finally para
            // asegurarnos que se cierra el fichero.
            if (null != fichero)
               fichero.close();
         } catch (Exception e2) {
            e2.printStackTrace();
         }
      }
   }

   /*
   Nos permite recuperar la informacion guardada en el archivo.
   */
   public void cargar(List<Integer> lista) {
      File archivo = null;
      FileReader fr = null;
      BufferedReader br = null;

      try {

         // Apertura del fichero y creacion de BufferedReader para poder
         // hacer una lectura comoda (disponer del metodo readLine()).
         archivo = new File ("./lista.txt");
         fr = new FileReader (archivo);
         br = new BufferedReader(fr);

         // Leemos la primera linea del archivo
         String linea = br.readLine();

         // Mientras no lleguemos al final del archivo
         // que vaya agregando la informacion a la lista.
         while(linea != null) {
            lista.add(Integer.parseInt(linea));
            // Pasamos a la siguiente linea del archivo
            linea = br.readLine();
         }

      } catch(Exception e) {
         e.printStackTrace();
      } finally {
         // En el finally cerramos el fichero, para asegurarnos
         // que se cierra tanto si todo va bien como si salta
         // una excepcion.
         try {
            if( null != fr ) {
               fr.close();
            }
         } catch (Exception e2) {
            e2.printStackTrace();
         }
      }
   }

   // Visualiza el menu
   public void visualizaMenu() {
      System.out.println("\nMenu");
      System.out.println("");
      System.out.println("1) Agregar al final");
      System.out.println("2) Agregar por posicion");
      System.out.println("3) Modificar");
      System.out.println("4) Borrar");
      System.out.println("5) Visualizar todos");
      System.out.println("6) Visualiza un elemento");
      System.out.println("7) Guardar");
      System.out.println("8) Cargar info.");
      System.out.println("0) Salir");
   }

   // Metodo para trabajar un lista simple de enteros.
   public void listaSimpleInt() {
      /*
      int -> Integer
      double -> Double
      float -> Float
      boolean -> Boolean
      */
      List<Integer> l = new ArrayList<Integer>();

      Scanner teclado = new Scanner(System.in);

      int op = 0, act = 0, valor = 0;

      do {
         visualizaMenu();
         System.out.println("\nOpcion: ");
         op = teclado.nextInt();

         switch(op) {
         // Salir
         case 0:
            break;
         // Agregar al final
         case 1:
            System.out.println("Valor?");
            valor = teclado.nextInt();
            l.add(valor);
            break;
         // Agregar por posicion
         case 2:
            do {
               System.out.println("Posicion?");
               act = teclado.nextInt();
               if(act < 0 || act >= l.size()) {
                  System.out.println("Fuera de rango [0-" + (l.size() - 1) + "]");
               }
            } while(act < 0 || act >= l.size());

            System.out.println("Valor?");
            valor = teclado.nextInt();
            l.add(act, valor);

            break;
         // Modificar
         case 3:
            do {
               System.out.println("Posicion?");
               act = teclado.nextInt();
               if(act < 0 || act >= l.size()) {
                  System.out.println("Fuera de rango [0-" + (l.size() - 1) + "]");
               }
            } while(act < 0 || act >= l.size());
            System.out.println("Nuevo valor? ");
            valor = teclado.nextInt();

            l.set(act, valor);

            break;
         // Borrar
         case 4:
            do {
               System.out.println("Posicion?");
               act = teclado.nextInt();
               if(act < 0 || act >= l.size()) {
                  System.out.println("Fuera de rango [0-" + (l.size() - 1) + "]");
               }
            } while(act < 0 || act >= l.size());

            l.remove(act);

            break;
         // Visualizar todos
         case 5:
            for(int i = 0; i < l.size(); i++) {
               System.out.println(i + " --> " + l.get(i));
            }
            break;
         // Visualizar un elem.
         case 6:
            do {
               System.out.println("Posicion?");
               act = teclado.nextInt();
               if(act < 0 || act >= l.size()) {
                  System.out.println("Fuera de rango [0-" + (l.size() - 1) + "]");
               }
            } while(act < 0 || act >= l.size());
            System.out.println(act + " --> " + l.get(act));
            break;
         // Guardar
         case 7:
            guardar(l);
            break;
         // Cargar info
         case 8:
            cargar(l);
            break;
         default:
            System.out.println("Opcion invalida");
         }

      } while(op != 0);
   }

   // HACER los metodos para cadenas y datos abstractos.
   // public void listaSimpleString() {}
   // public void listaSimplePersona() {}

   public static void main(String[] args) {
      ListaSimple ls = new ListaSimple();

      // Faltaria hacer un menu para elegir cualquiera de
      // las 3 opciones:
      ls.listaSimpleInt();
      // ls.listaSimpleString();
      // ls.listaSimplePersona();
   }
}