#include <iostream.h>
#include <fstream.h>
#include <string>
#include "parse.h"

class Person {
 private:
  int age;
  string phoneNumber;
  string name;
  static const char sep=':';

 public:
  int Age() { return age; }
  string Name() { return name; }

  void setAge(int a) { age=a; }

  friend istream& operator>>(istream&, Person&);
  friend ostream& operator<<(ostream&, const Person&);
  friend ifstream& operator>>(ifstream&, Person&);
  friend ofstream& operator<<(ofstream&, const Person&);

};

istream& operator >> (istream& i, Person& p)
{

  cout << "Enter name: ";
  i >> p.name;
  
  if (i) {
    cout << "Enter age: ";
    i >> p.age;
    cout << "Enter phone number: ";
    i >> p.phoneNumber; 
  }

  return i; // most common mistake: forgetting to return the stream
}

ostream& operator << (ostream& o, const Person& p)
{
  o << p.name << endl;
  o << "  Age: " << p.age << ", Phone: " << p.phoneNumber << endl;

  return o;  // most common mistake: forgetting to return the stream
}

ifstream& operator >> (ifstream& i, Person& p)
{
  string line;
  parseCont fields;

  getline(i,line);
  if (i) {
    if (parse(fields,Person::sep,line) == 3) {
      p.age = atoi(fields[0].c_str());
      p.phoneNumber = fields[1];
      p.name = fields[2];
    }
    else {
      cerr << "Bad format for Person." << endl;
      exit(1);
    }
  }
  return i;
}

ofstream& operator << (ofstream& o, const Person& p)
{
  o << p.age << Person::sep << p.phoneNumber << Person::sep << p.name << endl;

  return o;
}

