// bdtfnos.cpp - Acceso aleatorio
#include <iostream>
#include <fstream>
#include <string>
#include "persona.h"
#include "telefonos.h"
#include "leerdatos.h"
using namespace std;

int main()
{
  // Opciones del menú
  static char *opciones[] = 
  { 
    "Nuevo fichero",
    "Abrir fichero",
    "Añadir registros",
    "Buscar un registro",
    "Buscar siguiente",
    "Modificar un registro",
    "Eliminar un registro",
    "Salir"
  };
  int nOpciones = sizeof(opciones)/sizeof(char*);
  
  string cadenabuscar, nombreFichero, str;
  
  CTelefonos fs; // flujo de E/S
  CPersona reg;
  long nreg, tfno;
  bool salir = false, eliminado = false;

  while(true)
  {
    str = "ninguno";
    if (fs.Modo() == 1)
      str = nombreFichero + " abierto para leer y escribir";
    else if (fs.Modo() == 2)
      str = nombreFichero + " abierto para añadir";
    cout << "\nFichero actual: " << str;

    try
    {
      switch (menu(opciones, nOpciones))
      {
        case 1: // crear un fichero nuevo
          cout << "\nNombre del fichero: ";
          leerDato(nombreFichero);
          fs.Nuevo(nombreFichero);
          break;
        case 2: // abrir un fichero existente
          cout << "\nNombre del fichero: ";
          leerDato(nombreFichero);
          fs.Abrir(nombreFichero);
          break;
        case 3: // añadir un registro al fichero actual
          fs.Agregar();
          break;
        case 4: // buscar un registro en el fichero actual
          cout << "Nombre total o parcial (entrar => siguiente): ";
          leerDato(cadenabuscar);
          // Buscar a partir del registro 1
          nreg = fs.Buscar(cadenabuscar.c_str(), 1);
          if (nreg == -1)
            cout << "búsqueda fallida\n";
          else
          {
            reg = fs.LeerReg(nreg);
            cout << reg << endl;
          }
          break;
        case 5: // buscar un registro en el fichero actual
          nreg = fs.Buscar(cadenabuscar.c_str(), nreg+1);
          if (nreg == -1)
            cout << "búsqueda fallida\n";
          else
          {
            reg = fs.LeerReg(nreg);
            cout << reg << endl;
          }
          break;
        case 6: // modificar
          fs.Modificar();
          break;
        case 7: // eliminar
          cout << "Número de teléfono: ";
          leerDato(tfno);
          eliminado = fs.Eliminar(tfno);
          if (eliminado)
            cout << "registro eliminado\n";
          else
            cout << "no se pudo eliminar el registro\n";
          break;
        case 8: // salir
          if (fs.TieneRegsBorrados())
            fs.Actualizar();
          salir = true;
      }
    }
    catch(ios_base::failure& e)
    {
      cout << e.what() << endl;
    }
    if (salir) break;
  }
}

