//Person class
/*
 * Benis Munezero
 * COSC 327.001
 * Lab 6, inheritance - Class person
 */
import java.util.Scanner;
public class Person {
  private String firstName;
  private String lastName;
  public Person () {
    firstName = " ";
    lastName = " ";
  }
  public Person (String fName, String lName) {
    firstName = fName;
    lastName = lName;
  }
  public String getFirstName () {
    return firstName;
  }
  public String getLastName(){
    return lastName;
  }
  public void setName( String fName, String lName ) {
    firstName = fName;
    lastName = lName;
  }
  public void printLastFirst(){
    System.out.print(lastName + "," + firstName);
  }
  public void print() {
    System.out.print(firstName  + " " + lastName);
  }
  public String toString(){
    return firstName + " " + lastName;
  }
  public boolean equals(Object o) {
    if (o instanceof Person) {
      Person p = (Person) o;
      return (firstName == p.firstName && lastName == p.lastName);
    }
    else
      return false;
  }
  public void copy(Person p){
    firstName = p.firstName;
    lastName = p.lastName;
  }
  public Person getCopy(){
    return new Person (firstName, lastName);
  }
}
//Employee
/*
 * Class Employee - Subclass of Person
 */
public class Employee extends Person {
  private double payRate;
  private double hoursWorked;
  private String department;
  public final int HOURS = 40;
  public final double OVERTIME = 1.5;
  public Employee() {
    super();
    payRate = 0;
    hoursWorked = 0;
    department = " ";
  }
  public Employee (String fName, String lName, double pRate, double hWorked, String dpt) {
    super (fName, lName);
    payRate = pRate;
    hoursWorked = hWorked;
    department = dpt;
  }
  public String toString(){
    return "The wages for " + super.toString() + " from the " + department + " department are: $" + calculatePay();
  }
  public void print() {
    System.out.println("The employee " + super.toString() + " from the " + department + " department worked " + hoursWorked + " hours \nWith a pay rate of $" + payRate + ". The wages for this employee are $" + calculatePay());
  }
  public double calculatePay() {
    double regularPay, overTimePay,totalPay;
    if (hoursWorked > HOURS) {
      double overTimeHrs = hoursWorked - HOURS;
      regularPay = payRate * HOURS;
      overTimePay = overTimeHrs * OVERTIME;
      totalPay = regularPay + overTimePay;      
    } else {
      regularPay = payRate * hoursWorked;
      totalPay = regularPay;
    }
    return totalPay;
  }
  public void setAll(String fName, String lName, double pRate, double hWorked, String dpt) {
  super.setName(fName, lName);
    payRate = pRate;
    hoursWorked = hWorked;
    department = dpt;
}
  public double getPayRate() {
    return payRate;
  }
  public double getHoursWorked(){
    return hoursWorked;
  }
  public String getDepartment() {
    return department;
  }
  public boolean equals(Object o) {
    if (o instanceof Employee) {
      Employee e = (Employee) o;
      return (super.equals(e) && payRate == e.payRate && hoursWorked == e.hoursWorked && department.equals(e.department));
    } else {
      return false;
    }
  }
  public void copy(Employee e){
    super.copy(e);
    payRate = e.payRate;
    hoursWorked = e.hoursWorked;
    department = e.department;
  }
  public Employee getCopy(){
    return new Employee(super.getFirstName(), super.getLastName(), payRate, hoursWorked, department );
  }
}
//ClientEmployee
/*
 * Client for Employee class
 */
import java.util.Scanner;
public class ClientEmployee {
  public static void main(String[] arg) {
  Scanner sc = new Scanner(System.in);
  String last, first, dept;
  double pay_rate;
  int hours;
  Employee prof = new Employee("John", "Doe", 25.50, 50, "COSC");
  System.out.println( prof.toString());
  //create some Person objects
  Person person1 = new Person("Alice", "Smith");
  Person person2 = new Person("John", "Lamb");
    //print out the Person objects
    System.out.println(person1.getFirstName() + " " + person1.getLastName());
    System.out.println(person2.getFirstName() + " " + person2.getLastName());
    //create some employee objects
    Employee employee1 = new Employee("Marc", "Rain", 20.0, 45.0, "IT");
    Employee employee2 = new Employee("Lucas", "Lorenzo", 22.12, 50.0, "HR");
    System.out.println();
    //print earnings of employees - directly using caculatepay method
    System.out.printf("%s's earnings $%.2f\n", employee1.getLastName(), employee1.calculatePay());
    System.out.printf("%s's earnings $%.2f\n", employee2.getFirstName(), employee2.calculatePay());
    // test setting names changed first employee name
    employee1.setName("Marcus", "Johnson");
    employee2.setName("John", "Lamb");
    //print out changed employee names
    employee1.print();
    employee2.print();
    System.out.println();
    //check if employee 1 is the same as employee 2
    if (employee1.equals(employee2))
      System.out.println("Employees are the same");
    else
      System.out.println("Couldn't find an employee with same record.");
    //create a new employee object and copy employee 1 into new employee object
    Employee employee3 = new Employee();
    employee3.copy(employee1);
    System.out.println(employee3.toString());
    // check if new employee object is the same as employee 1 that it was copied from
     if (employee1.equals(employee3))
      System.out.println("Employees are the same");
    else
      System.out.println("Couldn't find an employee with same record.");
  last = getString(sc, "\nCreate your own employee!\nEnter employee last name: ");
  first = getString(sc, "Enter employee first name: ");
  dept = getString(sc, "Enter department: ");
  pay_rate = getDouble(sc, "Enter pay rate: ");
  hours = getInt(sc, "Enter hours worked: ");
  Employee newEmp = new Employee();
    newEmp.setAll(first, last, pay_rate, hours, dept);
  System.out.println(newEmp.toString());
  }
  public static String getString(Scanner sc, String prompt) {
    System.out.println(prompt);
    while (!sc.hasNext()) {
      sc.nextLine();
      System.out.print("Invalid name! Try again");
    }
    return sc.nextLine();
  }
  public static double getDouble(Scanner sc, String prompt) {
    System.out.println(prompt);
    while (!sc.hasNextDouble()) {
      sc.next();
      System.out.print("Invalid number! Try again");
    }
    return sc.nextDouble();
  }
  public static int getInt(Scanner sc, String prompt) {
    System.out.println(prompt);
    while (!sc.hasNextInt()) {
      sc.next();
     System.out.println("Invalid number! Try again");
    }
    return sc.nextInt();
  }
}
