#include <iostream>
//#include <fstream>
#include <iomanip>
#include <string>
#include <climits>
using namespace std;

struct Person
{
      string firstName;
      string lastName;
      string phoneNumber;
};
struct Address
{
        string streetNum_Name;
        string city;
        string state;
        int zip_code;
};
struct Info
{
       Person person;
       Address address;
};

void printFileHeader(ostream& outFile);
bool openInputFile(istream& inFile);
void openOutputFile(ostream& outFile);
bool readInfo(istream& inFile, Info&);
void printInfo(ostream& outFile, const Info&);

int main()
{       
        //ifstream inFile;
        istream& inFile = cin;
        //ofstream outFile;
        ostream& outFile = cout;
        bool fileStreamState;

        Info person;

        fileStreamState = openInputFile(inFile);
        
        openOutputFile(outFile);
        printFileHeader(outFile);

        //cout << "Processing information. Please Wait...." << endl << endl;

        while (readInfo(inFile, person)) {
            printInfo(outFile, person);
        }

        outFile << setw(7) << "-----" << setw(20) << "---------" << setw(15) << "----------" << setw(20) << "----" 
                << setw(12) << "------------" << endl;

        cout << "Program has finished execution." << endl;
        //inFile.close();
        //outFile.close();
}

void printFileHeader(ostream& outFile) {

        outFile << left << setw(7) << "Entry" << setw(20) << "Last Name" << setw(15) << "First Name" << setw(20) << "City" 
                << setw(12) << "Phone Number" << endl;
        outFile << setw(7) << "-----" << setw(20) << "---------" << setw(15) << "----------" << setw(20) << "----" 
                << setw(12) << "------------" << endl;
}

bool openInputFile(istream& inFile) {

        /*
        string filename;

        cout << "Enter the name of the input file: "; 
        cin >> filename;
        cout << filename << endl << endl;

        inFile.open(filename.c_str());

        while(inFile.fail()) {
                
                cout << string(15,'*') << " File Open Error " <<  string(15,'*')  << endl;
                cout << "==> Input file failed to open properly!!\n";
                cout << "==> Attempted to open file: " << filename << endl;
                cout << "==> Try Again\n";
                cout << string(47,'*') << endl<< endl;

                inFile.clear();

                cout << "Enter in the name of the input file: ";
                cin >> filename;
                cout << filename << endl << endl;  
                inFile.open(filename.c_str());  
        }
        */
        return 1;
}

void openOutputFile(ostream& outFile) {

        /*
        string filename;

        cout << "Enter the name of the output file: ";
        cin >> filename;
        cout << filename << endl << endl;

        outFile.open(filename.c_str());

        while(outFile.fail()) {

                cout << string(15,'*') << " File Open Error " <<  string(15,'*')  << endl;
                cout << "==> Output file failed to open properly!!\n";
                cout << "==> Attempted to open file: " << filename << endl;
                cout << "==> Try Again\n";
                cout << string(47,'*') << endl<< endl;

                outFile.clear();

                cout << "Enter in the name of the input file: ";
                cin >> filename;
                cout << filename << endl << endl;  
                outFile.open(filename.c_str());  
        }
        */
}

bool readInfo(istream& inFile, Info& record) {

        getline(inFile, record.person.phoneNumber);
        //cout << record.person.phoneNumber << endl;

        getline(inFile, record.person.lastName);
        //cout << record.person.lastName << endl;

        getline(inFile, record.address.streetNum_Name); 
        //cout << record.address.streetNum_Name << endl;
        
        getline(inFile, record.address.city);
        //cout << record.address.city << endl;

        getline(inFile, record.address.state); 
        //cout << record.address.state << endl;
        
        inFile >> record.address.zip_code;
        inFile.ignore(INT_MAX, '\n');
        //cout << record.address.zip_code << endl;

        getline(inFile, record.person.firstName);
        //cout << record.person.firstName << endl;

        return !inFile.fail();
}

void printInfo(ostream& outFile, const Info& record) {

        static int entry = 0;

        entry++;

        outFile << left << setw(7) << entry << setw(20) << record.person.lastName << setw(15) << record.person.firstName 
                << setw(20) << record.address.city << setw(12) << record.person.phoneNumber << endl;
}