#include <stdio.h>
/* constants */
#define NUM_EMPL 5
#define OVERTIME_RATE 1.5f
#define STD_WORK_WEEK 40.0f

/* function prototypes */
float getHours(long int clockNumber);
float calcOvertime(float hoursWorked);
float calcGrossPay(float hoursWorked, float wageRate, float overtimeHours);

void printHeader(void);
void printEmp(long int clockNumber, float wageRate, float hours, float overtimeHrs, float grossPay);

int main() {

  /* Variable Declarations */
  long int clockNumber[NUM_EMPL] = {98401, 526488, 765349, 34645, 127615}; /* ID */
  float grossPay[NUM_EMPL]; /* gross pay */
  float hours[NUM_EMPL]; /* hours worked in a given week */
  int i; /* loop and array index */
  float overtimeHrs[NUM_EMPL]; /* overtime hours */
  float wageRate[NUM_EMPL] = {10.60, 9.75, 10.50, 12.25, 8.35}; /* hourly wage rate */

  /* process each employee */
  for (i = 0; i < NUM_EMPL; ++i) {

    /* Read in the hours for an employee */
    hours[i] = getHours(clockNumber[i]);

    /* calculate overtime */
    overtimeHrs[i] = calcOvertime(hours[i]);

    /* calculate gross pay */
    grossPay[i] = calcGrossPay(hours[i], wageRate[i], overtimeHrs[i]);
  }

  /* print the header info */
  printHeader();

  /* print out each employee */
  for (i = 0; i < NUM_EMPL; ++i) {

    /* Print all the employees - call by reference */
    printEmp(clockNumber[i], wageRate[i], hours[i], overtimeHrs[i], grossPay[i]);
  } /* for */

  return (0);
}

float getHours(long int clockNumber) {

  float hoursWorked; /* hours worked in a given week */

  /* Read in hours for employee */
  printf("\nEnter hours worked by emp # %06li: ", clockNumber);
  scanf("%f", &hoursWorked);

  /* return hours back to the calling function */
  return (hoursWorked);
}

/* function to calculate overtime hours */
float calcOvertime(float hoursWorked) {
    float overtimeHrs;  /* overtime hours worked */
    if (hoursWorked > STD_WORK_WEEK) {
        overtimeHrs = hoursWorked - STD_WORK_WEEK;  /* calculate overtime */
    } else {
        overtimeHrs = 0.0;  /* no overtime */
    }
    return overtimeHrs;
}

/* function to print header information */
void printHeader(void) {
    printf("\nPay Slip Report\n");
    printf("====================================\n");
    printf("ID  Wage Rate Hours Overtime Gross Pay\n");
    printf("------------------------------------\n");
}

/* function to print employee information */
void printEmp(long int clockNumber, float wageRate, float hours,float overtimeHrs, float grossPay) {
    printf("%06li $%6.2f %6.1f %6.1f $%8.2f\n",clockNumber, wageRate, hours, overtimeHrs, grossPay);
}

/* function to calculate gross pay */
float calcGrossPay(float hoursWorked, float wageRate, float overtimeHrs) {
    float grossPay; // gross pay for the week 
    if (overtimeHrs > 0.0) { // if overtime was worked 
        grossPay = (STD_WORK_WEEK * wageRate) + (overtimeHrs * OVERTIME_RATE * wageRate);
    } 
    else { // no overtime worked 
        grossPay = hoursWorked * wageRate;
    }
    return grossPay;
}
