#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <conio2.h>
#include <limits>

using namespace std;

class dato{
public:
  string nombre;
  string direccion;
  string telefono;
  string nom(){return nombre;}
  string dir(){return direccion;}
  string tel(){return telefono;}
};

bool operator<(const dato &di,const dato &dd){
  return di.nombre<dd.nombre;
}

bool operator==(const dato &di,const dato &dd){
  return di.nombre.compare(dd.nombre)==0;
}

class agenda{
  vector<dato> datos;
  void leerdatos();
  void guardardatos();
  void muestra(int n);
  void leer(dato &d);
public:
  agenda(){leerdatos();}
  void menu();
  void agregar();
  void borrar();
  void modificar();
  void buscar();
};

void agenda::borrar(){
  int n;
  cout <<"Numero de contacto para borrar: ";
  cin >>n;
  if(cin.fail()or n<0 or n>datos.size()-1){
    cin.clear();
    while(cin.get()!='\n');
    cout <<"Numero invalido, NO se borro ningun registro\n";
  }else{
    datos.erase(datos.begin()+n);
    if(datos.size()>0)
      guardardatos();
  }
}

void agenda::modificar(){
  int n;
  dato d;
  cout <<"Numero de contacto para modificar (0-"
       <<datos.size()-1<<"): ";
  cin >>n;
  if(cin.fail()or n<0 or n>datos.size()-1){
    cin.clear();
    while(cin.get()!='\n');
    cout <<"Numero invalido\n";
  }else{
    muestra(n);
    leer(d);
    datos[n]=d;
    guardardatos();
  }
}

void agenda::muestra(int n){
  cout <<"#"<<n<<endl
       <<"Nombre: "<<datos[n].nom()<<endl
       <<"Direccion: "<<datos[n].dir()<<endl
       <<"Telefono: "<<datos[n].tel()<<endl<<endl;
}

void agenda::leerdatos(){
  string line;
  dato d;
  int i,n;
  ifstream miarchivo("agenda.txt");
  if(miarchivo.is_open()){
    datos.clear();
    miarchivo >> n;
    for(i=0;i<n;i++){
      getline(miarchivo,d.nombre);
      getline(miarchivo,d.direccion);
      getline(miarchivo,d.telefono);
      datos.push_back(d);
    }
    miarchivo.close();
  }
  else cout << "No hay datos guarados\n\n"; 
}

void agenda::guardardatos(){
  ofstream miarchivo;
  miarchivo.open ("agenda.txt");
  miarchivo << datos.size();
  sort(datos.begin(),datos.end());
  for(int i=0;i<datos.size();i++)
    miarchivo <<datos[i].nom()<<"\n"
              <<datos[i].dir()<<"\n"
              <<datos[i].tel()<<"\n";
  miarchivo.close();
}

void agenda::buscar(){
  int i;
  string cad;
  cout << "nombre a buscar: ";
  cin.ignore(numeric_limits<std::streamsize>::max(),'\n');
  getline(cin,cad);
  for(i=0;i<datos.size();i++)
    if(datos[i].nombre.find(cad)!=-1)
      muestra(i);
}

void agenda::menu(){
  int opcion;
  do{
    cout <<"\n\t1. agregar contacto.\n";
    cout <<"\t2. borrar contacto.\n";
    cout <<"\t3. modificar contacto.\n";
    cout <<"\t4. buscar contacto.\n";
    cout <<"\t5. terminar.\n\n";
    cout <<"\t\tOpcion: ";
    cin >> opcion;
    if(cin.fail()){
      cin.clear();
      while(cin.get()!='\n');
      opcion = 0;
    }
    switch(opcion){
      case 1:agregar();break;
      case 2:borrar();break;
      case 3:modificar();break;
      case 4:buscar();break;
    }
  }while(opcion!=5);
}

void agenda::agregar(){
  dato d;
  leer(d);
  datos.push_back(d);
  guardardatos();
}

void agenda::leer(dato &d){
  cin.ignore(numeric_limits<std::streamsize>::max(),'\n');
  cout <<"\nnombre: ";
  getline(cin,d.nombre);
  cout <<"direccion: ";
  getline(cin,d.direccion);
  cout <<"telefono: ";
  getline(cin,d.telefono);
}

main(){
  agenda a;
  a.menu();
/*    dato a,b;
    a.nombre="hola";
    b.nombre="que";
    cout << (a<b)<<(a==b);
    system("pause");*/
}
