<?php

abstract class Employee {
	const MANAGER = "Manager";
	const MARKETER = "Marketer";
	const ENGINEER = "Engineer";
	const ANALYST = "Analyst";

	protected int $grade;
	protected bool $chief;

	public function __construct(int $grade, bool $chief = false) {
		$this->grade = $grade;
		$this->chief = $chief;
	}

	public function getBaseRate();

	public function getActualPay() {
		$rate = $this->getBaseRate();
		if ($this->grade == 2) {
			$rate *= 1.25;
		} elseif ($this->grade == 3) {
			$rate = $rate * 1.5;
		}

		return $this->chief ? $rate * 2 : $rate;
	}

	public function getBaseCoffeeConsumption();

	public function getActualCoffeeConsumption() {
		return $this->chief ? $this->getBaseCoffeeConsumption() * 2 : $this->getBaseCoffeeConsumption();
	}

	public function getBasePaperworkProduced();

	public function getActualPaperworkProduced(): int {
		return $this->chief ? 0 : $this->getBasePaperworkProduced();	
	}
}

class Manager extends Employee {
	protected $baseRate = 500;
	protected $baseCoffeeConsumption = 20;
	protected int $basePaperworkProduced = 200;

    public function getBaseRate() {
		return $this->baseRate;
	}

	public function getBaseCoffeeConsumption() {
		return $this->baseCoffeeConsumption;
	}

	public function getBasePaperworkProduced() {
		return $this->basePaperworkProduced;
	}
}

class Marketer extends Employee {
	protected $baseRate = 400;
	protected $baseCoffeeConsumption = 15;
	protected int $basePaperworkProduced = 150;

    public function getBaseRate() {
		return $this->baseRate;
	}

	public function getBaseCoffeeConsumption() {
		return $this->baseCoffeeConsumption;
	}

	public function getBasePaperworkProduced() {
		return $this->basePaperworkProduced;
	}
}

class Engineer extends Employee {
	protected $baseRate = 200;
	protected $baseCoffeeConsumption = 5;
	protected int $basePaperworkProduced = 50;

    public function getBaseRate() {
		return $this->baseRate;
	}

	public function getBaseCoffeeConsumption() {
		return $this->baseCoffeeConsumption;
	}

	public function getBasePaperworkProduced() {
		return $this->basePaperworkProduced;
	}
}

class Analyst extends Employee {
	protected $baseRate = 800;
	protected $baseCoffeeConsumption = 50;
	protected int $basePaperworkProduced = 5;

    public function getBaseRate() {
		return $this->baseRate;
	}

	public function getBaseCoffeeConsumption() {
		return $this->baseCoffeeConsumption;
	}

	public function getBasePaperworkProduced() {
		return $this->basePaperworkProduced;
	}
}