// This example illustrates "real" base and derived classes in Java

import java.io.IOException;
import employeeStuff.Employee;
import employeeStuff.TemporaryEmployee;
import employeeStuff.HourlyEmployee;
import employeeStuff.SalariedEmployee;
import employeeStuff.PermanentEmployee;
import employeeStuff.CommissionEmployee;
import employeeStuff.PieceWorkEmployee;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import java.text.NumberFormat;
import java.util.Scanner;

public class TestEmployees {

    static final char TEMPORARY_EMPLOYEE = 't';
    static final char HOURLY_EMPLOYEE = 'h';
    static final char SALARIED_EMPLOYEE = 's';
    static final char PIECEWORK_EMPLOYEE = 'p';
    static final char COMMISSION_EMPLOYEE = 'c';

    public static void main(String[] args) throws IOException {
        ArrayList<Employee> employees = new ArrayList<Employee>();
        String benefit = JOptionPane.showInputDialog("Enter the benefit deduction", "100");
        if (benefit == null) {
            System.exit(0);
        }
        double benefitDeduction = Double.parseDouble(benefit);
        PermanentEmployee.setBenefitDeduction(benefitDeduction);
        String fileName = JOptionPane.showInputDialog("Enter the employee file name", "employees.data");
        Scanner employeeIn = new Scanner(new File(fileName));
        while (employeeIn.hasNext()) {
            char employeeStatus = employeeIn.nextLine().charAt(0);
            String id = employeeIn.nextLine();
            String nameLine = employeeIn.nextLine();
            Scanner parser = new Scanner(nameLine);
            String first = parser.next();
            String last = "";
            while (parser.hasNext()) {
                last += parser.next() + " ";
            } // end while
            switch (employeeStatus) {
                case TEMPORARY_EMPLOYEE: {
                    int hours = employeeIn.nextInt();
                    double rate = employeeIn.nextDouble();
                    employees.add(new TemporaryEmployee(id, first, last, hours, rate));
                    break;
                }
                case HOURLY_EMPLOYEE: {
                    int hours = employeeIn.nextInt();
                    double rate = employeeIn.nextDouble();
                    employees.add(new HourlyEmployee(id, first, last, hours, rate));
                    break;
                }
                case SALARIED_EMPLOYEE: {
                    double salary = employeeIn.nextDouble();
                    employees.add(new SalariedEmployee(id, first, last, salary));
                    break;
                }

                case PIECEWORK_EMPLOYEE: {
                    int number = employeeIn.nextInt();
                    double cost = employeeIn.nextDouble();
                    employees.add(new PieceWorkEmployee(id, first, last, number, cost));
                    break;
                }

                case COMMISSION_EMPLOYEE: {
                    double salary = employeeIn.nextDouble();
                    double commission = employeeIn.nextDouble();
                    double sales = employeeIn.nextDouble();
                    employees.add(new CommissionEmployee(id, first, last, salary, commission, sales));
                    break;
                }

                default:
                    System.out.println("Invalid employee status code!");
            } // end switch
            employeeIn.nextLine();
        } // end while
        // The following is used to format numbers
        NumberFormat currency = NumberFormat.getCurrencyInstance();
        String out = "";
        for (Employee employee : employees) {
            out += employee;
            if( employee.getIdNumber().equals("222334444") ) {
                JOptionPane.showMessageDialog(null, "Found " + employee.getFirstName() + " " + employee.getLastName() );
            }// end if
            // automatically formats the number as currency
            out += "Pay : " + currency.format(employee.pay()) + '\n';
            out += '\n';
        } // end for
        JOptionPane.showMessageDialog(null, out);
    } // end main
} // end TestEmployees


