/****************************************************/
/*                                                  */
/*   CSCI 121: Principles of Computer Programming   */
/*   Programming Project #7                         */
/*   Due Friday, March 11th                         */
/*   Programmed by Ian Giese                        */
/*                                                  */
/****************************************************/
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

double computeCharge(int arrived, int left)
{
       double charge;
       int time;
       time = left - arrived;
       if(time <= 40) charge = 10;
       else if(time <= 60) charge = 13;
       else if(time <= 90) charge = 18;
       else if(time <= 150) charge = 22;
       else if(time <= (8 * 60)) charge = 26;
       else charge = 28;
       if(time >= 360 && arrived >= 300 && arrived <= 540 && left <= 1140)
               charge = 14;
       return charge;
}

int timeToMinutes(int hour, int minute, char AP)
{
    int time;
    time = 0;
    if(AP == 'A' && hour == 12) hour = 0;
    if(AP == 'P' && hour != 12) hour += 12;
    time += (hour * 60) + minute;
    return time;
}

void doHeadings(ofstream &output)
{
    output << "Cust #    Arrive    Depart    Time   Charge" << endl
           << "------   -------   -------   -----   ------" << endl;
}

void doReportLine(ofstream &output, int custNum, int arrHour, int arrMinute, 
                 char arrAP, int depHour, int depMinute, char depAP, 
                 int arrived, int left, double charge)
{
    int time;
    time = left - arrived;
    output << " " << custNum << right << setw(6) << arrHour << ":";
    if(arrMinute < 10) output << "0";
    output << arrMinute << " ";
    if(arrAP == 'A') output << "AM";
    else if(arrAP == 'P') output << "PM";
    output << setw(4) << depHour << ":";
    if(depMinute < 10) output << "0";
    output << depMinute << " ";
    if(depAP == 'A') output << "AM";
    else if(depAP == 'P') output << "PM";
    output << setw(5) << time / 60 << ":";
    if(time % 60 < 10) output << "0";
    output << time % 60 << "   $" << charge << ".00" << endl;
}

int main()
{
    int custNum, arrHour, arrMinute, depHour, depMinute;
    char arrAP, depAP;
    int minuteArrived, minuteLeft;
    double charge;
    ifstream input("Assign7.txt");
    ofstream output("Output7.txt");
    
    doHeadings(output);
    
    while(!input.eof())
    {
          input >> custNum >> arrHour >> arrMinute >> arrAP >> depHour
                >> depMinute >> depAP >> ws;
          minuteArrived = timeToMinutes(arrHour, arrMinute, arrAP);
          minuteLeft    = timeToMinutes(depHour, depMinute, depAP);
          charge        = computeCharge(minuteArrived, minuteLeft);
          doReportLine(output, custNum, arrHour, arrMinute, arrAP, depHour,
                       depMinute, depAP, minuteArrived, minuteLeft, charge);
    }
    return 0;
}

