/* driver.cc                                                        -*- C++ -*-
**    Driver for the Employee Example
** 
** COPYRIGHT (C) 1994 Bradley M. Kuhn
**
** Written   :   Bradley M. Kuhn                                 Loyola College
**   By
**
** Written   :   David W. Binkley                                Loyola College
**   For         
**
** RCS       :
**
** $Source$
** $Revision$
** $Date$
**
** $Log$
** Revision 1.2  2004/10/05 00:41:19  lattner
** Don't print argv[0]
**
** Revision 1.1  2004/10/04 20:01:13  lattner
** Initial checkin of all of the source
**
** Revision 0.1  1994/12/24  01:48:26  bkuhn
**   # initial version
**
**
*/

#include "company.h"
#include "boss.h"
#include "commission.h"
#include "piece.h"
#include "hourly-no-over.h"
#include "hourly-over.h"

#include <stdio.h>

int
main(int argc, char *argv[])
{
    int        ii, totalWeeks;
    int        classCode;
    char       first[80], last[80];
    float      firstArg, secondArg;
    Employee * e;
    Company *  c;

    if (argc != 2) {
        fprintf(stderr, "usage: %s <number_of_weeks>\n", "employ");
        return 1;
    }

    cout << setiosflags(ios::showpoint | ios::fixed) << setprecision(2);

    totalWeeks = atoi(argv[1]);

    c = new Company();

    while (scanf("%d%s%s%f", &classCode, first, last, &firstArg) == 4) {
        switch(classCode) {
          case BOSS_ID:
            e = new Boss(first, last, firstArg);
            break;

          case HOURLY_WORKER_NO_OVERTIME_ID:
            e = new HourlyWorkerNoOvertime(first, last, firstArg);
            break;

          case HOURLY_WORKER_OVERTIME_ID:
            e = new HourlyWorkerOvertime(first, last, firstArg);
            break;

          case PIECE_WORKER_ID:
            e = new PieceWorker(first, last, firstArg);
            break;

          case COMMISSIONED_WORKER_ID:
            scanf("%f", &secondArg);
            e = new CommissionedWorker(first, last, firstArg, secondArg);
            break;

          default:
            fprintf(stderr, "INVALID EMPLOYEE CODE(%d)\n", classCode);
            return -1;
        }

        c->AddEmployee(e);
    }

    for(ii = 0; ii < totalWeeks; ii++) {
        c->NewWeek();
        c->PrintWithEarnings();
        if ( (ii % 10) == 0) c->AcrossTheBoardRaise(1);
    }
    return 0;
}
