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


/// Clase base para manipular Altas-Bajas-Cambios.
/**
 * Clase base para manipular Altas-Bajas-Cambios.
 * @author Antonio Carrillo Ledesma
 * @date Verano 2011
 * @version 0.0.1
 * @bug No errors detected
 * @todo ...
 */
public abstract class EstructuraABC {


   /// Lista
   public ArrayList<Registro> lista;

   public EstructuraABC() {
      lista = new ArrayList<Registro>();
   }


   /// Borra todo el contenido de la lista
   private void borrarTodo() {
      lista.clear();
   }



   /// Adiciona un registro al final de la lista
   abstract int adicionar();


   /// Visualiza el contenido del registro solicitado
   public int visualiza(int pos) {
      if (pos >= 0 && pos < lista.size()) {
         lista.get(pos).visualizaRegistro();
         return 0;
      }
      return 1;
   }

   /// Visualiza todo el contenido de la lista
   public int visualizaTodos() {
      Iterator<Registro> iter = lista.iterator();
      while (iter.hasNext()) {
         iter.next().visualizaRegistro();
      }
      return 0; // Error
   }

   /// Visualiza el registro de la lista solicitado
   int borrar(int pos) {
      if (pos >= 0 && pos < lista.size()) {
         lista.remove(pos);
         return 0;
      }
      return 1;
   }

   /// Modifica el registro de la lista solicitado
   int modificar(int pos) {
      if (pos >= 0 && pos < lista.size()) {
         lista.get(pos).modificarRegistro();
         return 0;
      }
      return 1;

   }

   /// Leer una lista de disco
   @SuppressWarnings("unchecked")
   int leer(String arch) {
      try {
         FileInputStream fileIn = new FileInputStream(arch);
         ObjectInputStream in = new ObjectInputStream(fileIn);
         Object obj = in.readObject();
         lista = (ArrayList<Registro>) obj;

         in.close();
         fileIn.close();
         visualizaTodos();
      }  catch(Exception e) {
         e.printStackTrace();
      }
      return 0;
   }

   /// Grabar una lista en disco
   int grabar(String arch) {
      try {
         FileOutputStream fileOut = new FileOutputStream(arch);
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(lista);

         out.close();
         fileOut.close();
      }  catch(Exception e) {}
      return 0;
   }

   /// Regresa el numero de registros en la lista
   int regresaNRegs() {
      return lista.size();
   }

};

