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


public class Test {

   public void guardar(Persona [] p) {
      FileWriter fichero = null;
      PrintWriter pw = null;

      try {

         fichero = new FileWriter("./personas.csv");
         pw = new PrintWriter(fichero);

         for(int i = 0; i < p.length; i++) {
            // Ignoramos las posiciones que sean null.
            if(p[i] != null) {
               // Como en este caso se trata de objetos Persona,
               // debemos separar la informacion de alguna forma.
               // En primer lugar, guardamos la posicion del objeto
               // dentro del arreglo, luego su nombre, despues su
               // apellido y por ultimo su edad. Todo esto separado
               // por comas.
               pw.println(i + "," + p[i].getNombre() +
                          "," + p[i].getApellidos() + "," + p[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();
         }
      }
   }

   public void cargar(Persona [] p) {
      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 ("./personas.csv");
         fr = new FileReader (archivo);
         br = new BufferedReader(fr);

         // Leemos la primera linea.
         String linea = br.readLine();
         // Debemos obtener la informacion de cada linea.
         String [] datos = null;
         // Indice de cada persona.
         int i = 0;

         // Mientras no lleguemos al final del archivo, seguimos trabajando.
         while(linea != null) {
            // Separamos la linea por cada coma y guardamos la info. en datos.
            datos = linea.split(",");
            // Convertimos el indice a un entero.
            i = Integer.parseInt(datos[0]);
            // Y guardamos a la persona en el indice que corresponde.
            // Tomamos el resto de los datos para crear a la persona.
            p[i] = new Persona(datos[1], datos[2], Integer.parseInt(datos[3]));
            // Pasamos a la segunda linea.
            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();
         }
      }
   }

   // 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) Cargar");
      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("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 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 || Tam >= 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 || Tam >= 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 || Tam >= 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;
         default:
            System.out.println("Opcion no reconocidad");

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

   // 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 || Tam >= 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;
         case 5:
            guardar(Arr);
            break;
         case 6:
            cargar(Arr);
            break;
         default:
            System.out.println("Opcion no reconocida");

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


   // Funcion Principal ....
   public static void main(String[] args) {
      Test t = new Test();
      // 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();
   }
}