<?php
 
abstract class Employee
{
 
    public function __construct($amountOfCoffe, $salary, $rank)
    {
 
        $this->amountOfCoffe = $amountOfCoffe;
        $this->salary = $salary;
        $this->rank = $rank;
 
    }
 
    public function getSalaryFromRank()
    {
 
        if($this->rank == 3){
            $rankSalary = $this->salary + ($this->salary * 0.5);
        } elseif ($this->rank == 2){
            $rankSalary = $this->salary + ($this->salary * 0.25);
        } elseif ($this->rank == 1){
            $rankSalary = $this->salary;
        } else {
            echo 'SHIEEEEEEET';
        }
      return $rankSalary;
    }
 
}
 
class Boss extends Employee
{
 
    public function getBossSalary()
    {
 
        $bossSalary = $this->getSalaryFromRank() + ($this->getSalaryFromRank() * 0.5);
        return $bossSalary;
 
    }
 
    public function getBossCoffeConsumption()
    {
 
        $bossCoffeConsumption = $this->amountOfCoffe * 2;
        return $bossCoffeConsumption;
 
    }
 
}
 
class Worker extends Employee
{  
    public $reports;
    public $blueprints;
    public $mainReports;
 
    public function getWorkerSalary()
    {
 
        $workerSalary = $this->getSalaryFromRank();
        return $workerSalary;
 
    }
 
 
}
 
class Manager extends Worker
{
 
    public $reports = 200;
 
}
 
class Engeneer extends Worker
{
 
    public $blueprints = 50;
 
}
 
class Analyst extends Worker
{
 
    public $mainReports = 5;
 
}
 
class Marcketolog extends Worker
{
 
    public $reports = 150;
 
}
 
 
 
function countAllWorkers ($array) {
 
    $workersInDepartment = count($array[1]) + 1;
    return $workersInDepartment;
 
}
 
function countAllSalary ($array) {
 
    $departmentSalary = 0;
    $departmentSalary += $array[0]->getBossSalary();
        foreach ($array[1] as $worker) {
            $departmentSalary += $worker->getWorkerSalary();    
        }
    return $departmentSalary;
}
 
function departmentCoffeConsumption ($array) {
 
    $departmentCoffe = 0;
    $departmentCoffe += $array[0]->getBossCoffeConsumption();
    foreach ($array[1] as $worker) {
            $departmentCoffe += $worker->amountOfCoffe;    
        }
    return $departmentCoffe;
}
 
function countDepartmentReports ($array) {
 
    $departmentReports = 0;
    foreach ($array[1] as $worker) {
        $departmentReports += $worker->reports; 
    }
    return $departmentReports;
}
 
function countDepartmentMainReports ($array) {
 
    $departmentMainReports = 0;
    foreach ($array[1] as $worker) {
        $departmentMainReports += $worker->mainReports; 
    }
    return $departmentMainReports;
}
 
function countDepartmentBlueprints ($array) {
 
    $departmentBlueprints = 0;
    foreach ($array[1] as $worker) {
        $departmentBlueprints += $worker->blueprints; 
    }
    return $departmentBlueprints;
}
 
function allPages ($array) {
 
    $departmentPages = countDepartmentBlueprints ($array) + countDepartmentReports ($array) + countDepartmentMainReports ($array);
    return $departmentPages;
 
}
 
function pageCost ($array) {
 
    $pagesMoneyRatio = 0;
    $pagesMoneyRatio = countAllSalary($array) / allPages($array);
    return $pagesMoneyRatio = round($pagesMoneyRatio, 2);
 
}
 
function totalEmployees($array) {
 
    $totalWorkers = 0;
    foreach ($array as $department) {
        $totalWorkers += countAllWorkers($department);
    }
    return $totalWorkers;
 
}
 
function totalSalary ($array) {
 
    $departmentsSalary = 0;
    foreach ($array as  $department) {
    $departmentsSalary +=  $department[0]->getBossSalary();
        foreach ($department[1] as $worker) {
            $departmentsSalary +=  $worker->getWorkerSalary();    
        }
    }    
    return $departmentsSalary;   
}
 
function totalCoffe ($array) {
 
    $departmentsCoffe = 0;
    foreach ($array as  $department) {
    $departmentsCoffe += $department[0]->getBossCoffeConsumption();
    foreach ($department[1] as $worker) {
            $departmentsCoffe += $worker->amountOfCoffe;    
        }
    }    
    return $departmentsCoffe;
 
}
 
function  totalPages ($array) {
 
    $departmentsPages = 0;
    foreach ($array as $department) {
        $departmentsPages += allPages($department);
    }
    return $departmentsPages;
 
}
 
function totalPageCost ($array) {
 
    $departmentsMoneyPagesRatio = 0;
 
        $departmentsMoneyPagesRatio = totalSalary($array) / totalPages($array); 
 
    return $departmentsMoneyPagesRatio = round($departmentsMoneyPagesRatio, 2);
 
}
 
function avarageEmployees ($array) {
 
    $avarageEmployees = 0;
    $avarageEmployees = totalEmployees($array) / count($array);
    return $avarageEmployees = round($avarageEmployees);
}
 
function  avarageSalary ($array) {
 
    $avarageSalary = 0;
    $avarageSalary = totalSalary($array) / count($array);
    return $avarageSalary = round($avarageSalary, 2);
 
}
 
function avaragePages ($array) {
 
    $avaragePages = 0;
    $avaragePages = totalPages($array) / count($array);
    return $avaragePages = round($avaragePages);
 
}
 
function avarageCoffe ($array) {
 
    $avarageCoffe = 0;
    $avarageCoffe = totalCoffe($array) / count($array);
    return $avarageCoffe = round($avarageCoffe, 1);
 
}
 
function avaragePageCost ($array) {
 
    $avaragePageCost = 0;
    $avaragePageCost = totalSalary($array) / totalPages($array);
    return $avaragePageCost = round($avaragePageCost, 2);
 
}
 
function padRight($string, $length)
{ 
 
    $string = str_pad ($string, $length, " ");
    return $string;
 
}
 
function padLeft($string, $length)
{
 
    $string = str_pad ($string, $length, " ", STR_PAD_LEFT);
    return $string;
 
}
 
 
$MarketingBoss = new Boss(20, 500, 3);
$logisticBoss = new Boss(20, 500, 1);
$sellersBoss = new Boss(20, 500, 2);
$purhaseBoss = new Boss(20, 500, 2);
 
$purchaseDepartmentWorkers = [
    $pDM1 = new Manager(20, 500, 1),
    $pDM2 = new Manager(20, 500, 1),
    $pDM3 = new Manager(20, 500, 1),
    $pDM4 = new Manager(20, 500, 1),
    $pDM5 = new Manager(20, 500, 1),
    $pDM6 = new Manager(20, 500, 1),
    $pDM7 = new Manager(20, 500, 1),
    $pDM8 = new Manager(20, 500, 1),
    $pDM9 = new Manager(20, 500, 1),
    $pDM10 = new Manager(20, 500, 2),
    $pDM11 = new Manager(20, 500, 2),
    $pDM12 = new Manager(20, 500, 2),
    $pDM13 = new Manager(20, 500, 3),
    $pDM14 = new Manager(20, 500, 3),
    $pDMa1 = new Marcketolog(15, 400, 1),
    $pDMa2 = new Marcketolog(15, 400, 1),
  ];
 
$sellersDepartmentWorkers = [
    $sDM1 = new Manager(20, 500, 1),
    $sDM2 = new Manager(20, 500, 1),
    $sDM3 = new Manager(20, 500, 1),
    $sDM4 = new Manager(20, 500, 1),
    $sDM5 = new Manager(20, 500, 1),
    $sDM6 = new Manager(20, 500, 1),
    $sDM7 = new Manager(20, 500, 1),
    $sDM8 = new Manager(20, 500, 1),
    $sDM9 = new Manager(20, 500, 1),
    $sDM10 = new Manager(20, 500, 1),
    $sDM11 = new Manager(20, 500, 1),
    $sDM12 = new Manager(20, 500, 1),
    $sDMa1 = new Marcketolog(15, 400, 1),
    $sDMa2 = new Marcketolog(15, 400, 1),
    $sDMa3 = new Marcketolog(15, 400, 1),
    $sDMa4 = new Marcketolog(15, 400, 1),
    $sDMa5 = new Marcketolog(15, 400, 1),
    $sDMa6 = new Marcketolog(15, 400, 1),
    $sDAn1 = new Analyst(50, 800, 1),
    $sDAn2 = new Analyst(50, 800, 1),
    $sDAn3 = new Analyst(50, 800, 1),
    $sDAn4 = new Analyst(50, 800, 2),
    $sDAn5 = new Analyst(50, 800, 2),
 
];
 
$marketingDepartmentWorkers = [
    $mDMa1 = new Marcketolog(15, 400, 1),
    $mDMa2 = new Marcketolog(15, 400, 1),
    $mDMa3 = new Marcketolog(15, 400, 1),
    $mDMa4 = new Marcketolog(15, 400, 1),
    $mDMa5 = new Marcketolog(15, 400, 1),
    $mDMa6 = new Marcketolog(15, 400, 1),
    $mDMa7 = new Marcketolog(15, 400, 1),
    $mDMa8 = new Marcketolog(15, 400, 1),
    $mDMa9 = new Marcketolog(15, 400, 1),
    $mDMa10 = new Marcketolog(15, 400, 1),
    $mDMa11 = new Marcketolog(15, 400, 1),
    $mDMa12 = new Marcketolog(15, 400, 1),
    $mDMa13 = new Marcketolog(15, 400, 1),
    $mDMa14 = new Marcketolog(15, 400, 1),
    $mDMa15 = new Marcketolog(15, 400, 1),
    $mDMa16 = new Marcketolog(15, 400, 2),
    $mDMa17 = new Marcketolog(15, 400, 2),
    $mDMa18 = new Marcketolog(15, 400, 2),
    $mDMa19 = new Marcketolog(15, 400, 2),
    $mDMa20 = new Marcketolog(15, 400, 2),
    $mDMa21 = new Marcketolog(15, 400, 2),
    $mDMa22 = new Marcketolog(15, 400, 2),
    $mDMa23 = new Marcketolog(15, 400, 2),
    $mDMa24 = new Marcketolog(15, 400, 2),
    $mDMa25 = new Marcketolog(15, 400, 2),
    $mDM1 = new Manager(20, 500, 1),
    $mDM2 = new Manager(20, 500, 1),
    $mDM3 = new Manager(20, 500, 1),
    $mDM4 = new Manager(20, 500, 1),
    $mDM5 = new Manager(20, 500, 1),
    $mDM6 = new Manager(20, 500, 1),
    $mDM7 = new Manager(20, 500, 1),
    $mDM8 = new Manager(20, 500, 1),
    $mDEn1 = new Engeneer(5, 200, 1),
    $mDEn2 = new Engeneer(5, 200, 1),
];
 
$logisticDepartmentWorkers = [
    $lDM1 = new Manager(15, 500, 1),
    $lDM2 = new Manager(20, 500, 1),
    $lDM3 = new Manager(20, 500, 1),
    $lDM4 = new Manager(20, 500, 1),
    $lDM5 = new Manager(20, 500, 1),
    $lDM6 = new Manager(20, 500, 1),
    $lDM7 = new Manager(20, 500, 1),
    $lDM8 = new Manager(20, 500, 1),
    $lDM9 = new Manager(20, 500, 1),
    $lDM10 = new Manager(20, 500, 1),
    $lDM11 = new Manager(20, 500, 1),
    $lDM12 = new Manager(20, 500, 1),
    $lDM13 = new Manager(20, 500, 1),
    $lDM14 = new Manager(20, 500, 2),
    $lDM15 = new Manager(20, 500, 2),
    $lDM16 = new Manager(20, 500, 2),
    $lDM17 = new Manager(20, 500, 2),
    $lDM18 = new Manager(20, 500, 2),
    $lDEn1 = new Engeneer(5, 200, 1),
    $lDEn2 = new Engeneer(5, 200, 1),
    $lDEn3 = new Engeneer(5, 200, 1),
    $lDEn4 = new Engeneer(5, 200, 1),
    $lDEn5 = new Engeneer(5, 200, 1),
];
 
$purchaseDepartment = [$purhaseBoss, $purchaseDepartmentWorkers];
$sellersDepartment = [$sellersBoss, $sellersDepartmentWorkers];
$marketingDepartment = [$MarketingBoss, $marketingDepartmentWorkers];
$logisticDepartment = [$logisticBoss, $logisticDepartmentWorkers];
 
$departments = [ "Purchase" => $purchaseDepartment, 
				 "Sellers" => $sellersDepartment,
				 "Marketing" => $marketingDepartment, 
				 "Logistic" =>$logisticDepartment];
 
$col1 = 20;
$col2 = 10;
$col3 = 10;
$col4 = 10;
$col5 = 10;
$col6 = 10;
 
 
echo padRight("Department", $col1) .
     padLeft("Employees", $col2) .
     padLeft("Salary", $col3) .
     padLeft("Coffe", $col4) .
     padLeft("Pages", $col5) .
     padLeft("Page cost", $col6) . "\n";
 
echo str_repeat("_", 80) . "\n";
 
foreach($departments as $department){
    echo padRight(key($department), $col1) .
         padLeft(countAllWorkers($department), $col2) .
         padLeft(countAllSalary($department), $col3) .
         padLeft(departmentCoffeConsumption($department), $col4) .
         padLeft(allPages($department), $col5) .
         padLeft(pageCost($department), $col6) . "\n";
}
 
echo str_repeat("_", 80) . "\n";
 
echo padRight("Total", $col1) .
     padLeft(totalEmployees($departments), $col2) .
     padLeft(totalSalary($departments), $col3) .
     padLeft(totalCoffe($departments), $col4) .
     padLeft(totalPages($departments), $col5) .
     padLeft(" ", $col6) . "\n";
 
echo str_repeat("_", 80) . "\n";
 
echo padRight("Avarage", $col1) .
     padLeft(avarageEmployees($departments), $col2) .
     padLeft(avarageSalary($departments), $col3) .
     padLeft(avarageCoffe($departments), $col4) .
     padLeft(avaragePages($departments), $col5) .
     padLeft(avaragePageCost($departments), $col6) . "\n";
 
/*
foreach($departments as $department) {
        echo str_repeat("_", 60) . "</br>";
        echo "Boss Salary: " . $department[0]->getBossSalary() . "\n" .
             "Boss coffe consumption " . $department[0]->getBossCoffeConsumption() . "\n" .
             "Boss rank: " . $department[0]->rank . "</br>";
        foreach ($department[1] as $worker) {
            echo "Salary:" . $worker->getWorkerSalary() . "\n" .
                 "Coffe consumption: " . $worker->amountOfCoffe . "\n" .
                 "Rank: " . $worker->rank . "</br>";   
        }
        echo str_repeat("_", 60) . "</br>";
    }
*/
 
/*
echo "Purchase Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($purchaseDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($purchaseDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($purchaseDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($purchaseDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($purchaseDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($purchaseDepartment) . "</br>";
echo "All pages: " . allPages($purchaseDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($purchaseDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
 
 
echo "Sellers Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($sellersDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($sellersDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($sellersDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($sellersDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($sellersDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($sellersDepartment) . "</br>";
echo "All pages: " . allPages($sellersDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($sellersDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
 
echo "Marketing Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($marketingDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($marketingDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($marketingDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($marketingDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($marketingDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($marketingDepartment) . "</br>";
echo "All pages: " . allPages($marketingDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($marketingDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
 
echo "Logistic Department" . "</br>";
echo str_repeat("_", 60) . "</br>";
echo "NumberOfWorkers: " . countAllWorkers($logisticDepartment) . "</br>";
echo "Total department salary: " . countAllSalary($logisticDepartment) . "</br>";
echo "Total department coffe consumption: " . departmentCoffeConsumption($logisticDepartment) . "</br>";
echo "Reports: " . countDepartmentReports($logisticDepartment) . "</br>";
echo "Main reports: " . countDepartmentMainReports($logisticDepartment) . "</br>";
echo "Blueprints: " . countDepartmentBlueprints($logisticDepartment) . "</br>";
echo "All pages: " . allPages($logisticDepartment) . "</br>";
echo "Cost of one page: " . pagesToMoneyRatio($logisticDepartment) . "</br>";
echo str_repeat("_", 60) . "</br>";
 
echo "Total employees: " . totalEmployees($departments) . "</br>";
echo "Total Salary: " . totalSalary($departments) . "</br>";
echo "Total Coffe: " . totalCoffe($departments) . "</br>";
echo "Total Pages: " . totalPages($departments) . "</br>";
echo "Total cost of one page: " . totalMonyPagesRation($departments) . "</br>";
echo str_repeat("_", 60) . "</br>";
 
echo "Avarage employees: " . AvarageEmployees($departments) . "</br>";
echo "Avarage salary: " . avarageSalary($departments) . "</br>";
echo "Avarage coffe: " . avarageCoffe($departments) . "</br>";
echo "Avarage pages: " . avaragePages($departments) . "</br>";
echo "Avarage page cost: " . avaragePageCost($departments) . "</br>";
 */
 