/* **********************Libro.h******************** */
#ifndef Libro_H
#define Libro_H
#include <iostream>
using namespace std;
 
 
const int TAM_ISBN = 11;
const int TAM_AUTOR = 40;
const int TAM_LIBRERIA = 20;
const int TAM_TITULO = 105;
 
class Typeisbn{
 public:
  Typeisbn(const char* isbn);
  Typeisbn();
  ~Typeisbn();
  bool operator == (const Typeisbn isbn);
  friend istream &operator >>(istream &is, Typeisbn isbn);
  friend ostream &operator <<(ostream &os,const Typeisbn &isbn);
  friend class Libro;
 private:
  char ISBN [TAM_ISBN];
};
 
class Libro{
 public:
  Libro *next;
  Libro();
  ~Libro();
  bool Es_Vacia(Libro l);
  void Insertarlibro (Libro l);
  Libro EliminarLibro(Libro l,Typeisbn busc); 
  friend istream &operator >>(istream &is, Libro &r);
  friend ostream &operator <<(ostream &os,const Libro &r);
  friend void Listar (Libro l);
  friend Libro* Buscar (Libro l, Typeisbn busc);
  void Listar (Libro l);
 private:  
  char Titulo [TAM_TITULO];
  char Libreria [TAM_LIBRERIA];
  char Autor [TAM_AUTOR];
  Typeisbn isbn;
  unsigned fechaedicion;
};
#endif
 
/* *******************Libro.C**************** */
#include "Libro.h"
 
 
Libro::Libro(){
}
 
Libro::~Libro(){
}
 
bool Libro::Es_Vacia(Libro l){
  if (!l.Titulo)
    return true;
  else 
    return false;
}
 
void Libro::Insertarlibro (Libro l){
  if (!Es_Vacia (l))
    *this->next = l;
  l = *this;
}
 
Libro EliminarLibro (Libro l,Typeisbn busc){
  Libro *aux,*ant;
  aux = Buscar(l,busc);
  *ant = l;
  do
    ant = ant->next;
  while (ant->next != aux);
  ant->next = aux->next;
  delete aux;
}
 
Libro* Buscar (Libro l, Typeisbn busc){
  Libro *aux,aux2;
  *aux = l;
  aux2 = *aux;
  bool salida = false;
  do{
    if(aux2.isbn == busc)
      break;
    if (aux -> next != NULL){
      aux = aux ->next;
      aux2 = *aux;
    };
    if ((aux -> next == NULL) && !(aux2.isbn == busc))
      salida = true;
  }while (!salida);
  return aux; 
}
 
void Libro::Listar (Libro l){
  Libro *aux;
  *aux = l;
  bool salida = false;
  do{
    cout << aux;
    if (aux -> next == NULL)
      salida = true;
    else
      aux = aux -> next;
  }while (!salida);
}
 
 
istream &operator >>(istream &is, Libro& r){
  cout << "Escribe el titulo del libro ";
  is >> r.Titulo;
  cout <<endl<< "Dime el autor del libro ";
  is >> r.Autor;
  cout <<endl<<  "Libreria ";
  is >> r.Libreria;
  cout <<endl<< "Fecha de edicion ";
  is >> r.fechaedicion;
  cout <<endl<<  "Escribe el isbn del libro ";
  is >> r.isbn;
}
 
 
ostream &operator <<(ostream &os,const Libro &r){
  os << "Libreria: " << r.Libreria <<endl;
  os << "Titulo: " << r.Titulo <<endl;
  os << "Autor: " << r.Autor <<endl;
  os << "Fecha de edicion" << r.fechaedicion << endl;
  os << "ISBN: " << r.isbn << endl;
return os;
}
 
bool operator == (const Typeisbn isbn1,const Typeisbn isbn2){
  if (isbn1  == isbn2)
    return true;
  else 
    return false;
}
 
istream &operator >>(istream &is, Typeisbn isbn){
  is >> isbn.ISBN;
  return is;
}
 
ostream &operator <<(ostream &os,const Typeisbn &isbn){
  os << isbn.ISBN;
  return os;
}
 
Typeisbn::Typeisbn(const char* isbn){
  ISBN = *isbn;
}
 
Typeisbn::Typeisbn(){
}
 
Typeisbn::~Typeisbn(){
}
 
 
/* *****************Prac4.C (main)**************** */
#include "Libro.h"
 
void Menu (bool s,Libro Lista){
  cout << "Elija la accion a realizar"<< endl;
  cout << "0:Salir    1:Insertar libro  2: Borrar libro" << endl;
  cout << "3:Buscar libro  4:Listado de libros" << endl;
  int opt;
  cin >> opt;
  switch (opt){
    case 0:{
            s = true;
      break;
           };
    case 1:{
            Libro Lib;
            cin >>Lib;
            Lib.Insertarlibro (Lista);
      break;
           };
    case 2:{ 
            cout << "Escribe el ISBN del libro que quieres eliminar" <<endl;
            Typeisbn busc;
            cin >> busc;
            Lista = EliminarLibro(Lista,busc);
            break;
           };
    case 3:{ 
            cout << "Escribe el ISBN del libro que quieres buscar" <<endl;
            Typeisbn busc;
            cin >> busc;
            Libro* Lib = Buscar (Lista,busc);
            cout <<"El libro buscado es: "<< Lib; 
      break;
           };
    case 4:{
            Listar (Lista);
            break;
           };
  };
}
 
int Main (){
  bool salida = false;
  Libro List;
  do
    Menu (salida,List);
  while (!salida);
  return (0);
}