package CHAPTER07;

//급여 지급을 위한 인터페이스
interface Payable {
	double calculatePay(); // 급여 계산
}

//세금 계산을 위한 인터페이스
interface Taxable {
	double calculateTax(); // 세금 계산
}

//추상 클래스: 직원의 공통 속성 및 기능 포함
abstract class AbstractEmployee implements Payable, Taxable {
	protected String name;
	protected int id;

	public AbstractEmployee(String name, int id) {
		this.name = name;
		this.id = id;
	}

	// 내부 클래스: 세금 계산을 담당
	class TaxCalculator {
		public double getTaxAmount(double salary) {
			return salary * 0.1; // 10% 세금 부과
		}
	}

	// 직원 정보 및 세금 정보 출력
	public void displayInfo() {
		double salary = calculatePay();
		double tax = calculateTax();
		System.out.println("ID: " + id + ", 이름: " + name + ", 급여: " + salary + ", 세금: " + tax);
	}
}

//정규직 직원 (월급제)
class SalariedEmployee extends AbstractEmployee {
	private double monthlySalary;

	public SalariedEmployee(String name, int id, double monthlySalary) {
		super(name, id);
		this.monthlySalary = monthlySalary;
	}

	@Override
	public double calculatePay() {
		return monthlySalary; // 정규직은 고정 월급
	}

	@Override
	public double calculateTax() {
		TaxCalculator taxCalculator = new TaxCalculator();
		return taxCalculator.getTaxAmount(monthlySalary);
	}
}

//시간제 직원 (시급제)
class HourlyEmployee extends AbstractEmployee {
	private double hourlyRate;
	private int hoursWorked;

	public HourlyEmployee(String name, int id, double hourlyRate, int hoursWorked) {
		super(name, id);
		this.hourlyRate = hourlyRate;
		this.hoursWorked = hoursWorked;
	}

	@Override
	public double calculatePay() {
		return hourlyRate * hoursWorked; // 시급 * 근무시간
	}

	@Override
	public double calculateTax() {
		TaxCalculator taxCalculator = new TaxCalculator();
		return taxCalculator.getTaxAmount(calculatePay());
	}
}

public class REAL_PayrollSystem {
	public static void main(String[] args) {
		// 직원 객체 생성
		AbstractEmployee emp1 = new SalariedEmployee("이한", 101, 3000000); // 월급제 직원
		AbstractEmployee emp2 = new HourlyEmployee("김편집", 102, 15000, 160); // 시급제 직원 (15000원 * 160시간)

		// 직원 정보 및 세금 정보 출력
		emp1.displayInfo();
		emp2.displayInfo();

		// 무명 클래스(Anonymous Class)를 사용하여 보너스 지급
		Payable bonusPayable = new Payable() {
			@Override
			public double calculatePay() {
				return 500000; // 50만 원 보너스 지급
			}
		};
		System.out.println("보너스 지급: " + bonusPayable.calculatePay());
	}
}
