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

public class ArregloUnidimensional {

   // Limpia la pantalla usando lineas en blanco
   public void limpiar() {
      for (int i = 0; i < 30; i++) System.out.println("");
   }

   // Visualiza el menu
   public void visualizaMenu() {
      System.out.println("Menu");
      System.out.println("");
      System.out.println("1) Agregar");
      System.out.println("2) Modificar");
      System.out.println("3) Borrar");
      System.out.println("4) Visualizar todos");
      System.out.println("5) Guardar");
      System.out.println("6) Leer");
      System.out.println("0) Salir");
   }


   // Arreglo unidimensional ...
   public void arregloUnidimensionalLong() {
      // Arreglo unidimensional
      long[]Arr;
      // Tamano arreglo unidimensional
      int Tam;

      // objeto para trabajar con teclado
      Scanner teclado = new Scanner(System.in);

      // Pregunta sobre el tamaño del arrglo
      do {
         System.out.println("Tamano del arreglo? ");
         Tam = teclado.nextInt();
         if(Tam < 0 || Tam > 10) System.out.println("Error en el tamano, rango de 1 a 10");
      } while(Tam < 0 || Tam > 10);
      Arr = new long[Tam];

      int op = 1, act = 0;
      // Menu
      do {
//         limpiar();
         visualizaMenu();
         System.out.println("");
         System.out.println("Opcion: ");
         op = teclado.nextInt();

         switch(op) {
         // Salir
         case 0:
            break;
         // Adicionar
         case 1:
            do {
               System.out.println("Posicion? ");
               act = teclado.nextInt();
               if(act < 0 || act >= Tam) System.out.println("Error en la posicion, rango de 0 a " + Tam);
            } while(act < 0 || act >= Tam);
            System.out.println("Valor? ");
            Arr[act] = teclado.nextInt();
            break;
         // Modificar
         case 2:
            do {
               System.out.println("Posicion? ");
               act = teclado.nextInt();
               if(act < 0 || act >= Tam) System.out.println("Error en la posicion, rango de 0 a " + Tam);
            } while(act < 0 || act >= Tam);
            System.out.println("Valor actual: " + Arr[act]);
            System.out.println("Nuevo valor: ");
            Arr[act] = teclado.nextInt();
            break;
         // Borrar
         case 3:
            do {
               System.out.println("Posicion? ");
               act = teclado.nextInt();
               if(act < 0 || act >= Tam) System.out.println("Error en la posicion, rango de 0 a " + Tam);
            } while(act < 0 || act >= Tam);
            Arr[act] = 0;
            break;
         // Visualizar
         case 4:
            for(act = 0; act < Tam; act++) System.out.println(act + "--> " + Arr[act]);
            break;
         // Guardar
         case 5:
            guardar(Arr);
            break;
         // Cargar info
         case 6:
            cargar(Arr);
            break;
         default:
            System.out.println("Opcion no reconocidad");

         }
      } while(op != 0);
      System.out.println("Fin del arreglo unidimensional");
   }

   // Guardar
   public void guardar(long [] Arr) {
      // 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("./listaLong.txt");
         pw = new PrintWriter(fichero);

         for(int i = 0; i < Arr.length; i++) {
            pw.println(Arr[i]);

         }

      } 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();
         }
      }
   }


   // Leer
   public void cargar(long [] Arr) {
      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 ("./listaLong.txt");
         fr = new FileReader (archivo);
         br = new BufferedReader(fr);


         for(int i = 0; i < Arr.length; i++) {
            Arr[i] = Integer.parseInt(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();
         }
      }
   }

   // Arreglo unidimensional ...
   public void arregloUnidimensionalDatoAbstracto() {
      // Arreglo unidimensional
      Persona [] Arr;
      // Tamano arreglo unidimensional
      int Tam;

      // objeto para trabajar con teclado
      Scanner teclado = new Scanner(System.in);

      // Pregunta sobre el tamaÃ±o del arrglo
      do {
         System.out.println("TamaÃ±o del arreglo? ");
         Tam = teclado.nextInt();
         if(Tam <= 0 || Tam > 10) {
            System.out.println("Error en el tamaÃ±o, rango de 1 a 10");
         }
      } while(Tam <= 0 || Tam > 10);

      Arr = new Persona[Tam];

      int op = 1, act = 0;
      String nombre, apellido;
      int edad;
      // Menu
      do {
//         limpiar();
         visualizaMenu();
         System.out.println("");
         System.out.println("Opcion: ");
         op = teclado.nextInt();

         switch(op) {
         // Salir
         case 0:
            break;
         // Adicionar
         case 1:
            do {
               System.out.println("Posicion? ");
               act = teclado.nextInt();
               if(act < 0 || act >= Tam) {
                  System.out.println("Error en la posicion, rango de 0 a " + Tam);
               }
            } while(act < 0 || act >= Tam);

            System.out.println("Nombre(s)? ");
            teclado.skip("\n");
            nombre = teclado.nextLine();

            System.out.println("Apellidos? ");
            apellido = teclado.nextLine();

            System.out.println("Edad? ");
            edad = teclado.nextInt();

            Persona p = new Persona(nombre, apellido, edad);
            Arr[act] = p;
            break;
         // Modificar
         case 2:
            do {
               System.out.println("Posicion? ");
               act = teclado.nextInt();
               if(act < 0 || act >= Tam) System.out.println("Error en la posicion, rango de 0 a " + Tam);
            } while(act < 0 || act >= Tam);
            System.out.println("Valor actual: " + Arr[act]);
            System.out.println("Nuevo valor: ");
            teclado.skip("\n");
            //Arr[act] = teclado.nextLine();
            break;
         // Borrar
         case 3:
            do {
               System.out.println("Posicion? ");
               act = teclado.nextInt();
               if(act < 0 || act >= Tam) System.out.println("Error en la posicion, rango de 0 a " + Tam);
            } while(act < 0 || act >= Tam);
            Arr[act] = null;
            break;
         // Visualizar
         case 4:
            for(act = 0; act < Tam; act++) {
               System.out.print(act + "--> ");
               if(Arr[act] == null) {
                  System.out.println("null");
               } else {
                  Arr[act].visualiza();
               }
            }
            break;
         // Guardar
         case 5:
            guardar(Arr);
            break;
         // Cargar info
         case 6:
            cargar(Arr);
            break;

         default:
            System.out.println("Opcion no reconocida");

         }
      } while(op != 0);
      System.out.println("Fin del arreglo unidimensional");
   }

   // Guardar
   public void guardar(Persona [] Arr) {
      // 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 < Arr.length; i++) {
            pw.println(Arr[i].getNombre());
            pw.println(Arr[i].getApellidos());
            pw.println(Arr[i].getEdad());
         }

      } 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();
         }
      }
   }


   // Leer
   public void cargar(Persona [] Arr) {
      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);


         for(int i = 0; i < Arr.length; i++) {
            String nombre = br.readLine();
            String apellido = br.readLine();
            int edad = Integer.parseInt(br.readLine());

            Persona p = new Persona(nombre, apellido, edad);
            Arr[i] = p;
            Arr[i].visualiza();
         }

      } 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();
         }
      }
   }


   // Funcion Principal ....
   public static void main(String[] args) {
      ArregloUnidimensional t = new ArregloUnidimensional();
      // Falta hacer un menu para saber a cual acceso o a todos

      // Primero entra al de Long
      t.arregloUnidimensionalLong();

      // Despues al de dato abstracto (persona)
      t.arregloUnidimensionalDatoAbstracto();
   }
}

