<?php

class Company {
    
    var $departments = [];
    
    function __construct($departments) {
        
        $this->departments = $departments;
        
    }
    
    public function totalEmployees()
    {
        
        $totalEmployees = 0;
        foreach ($this->departments as $department){
                $totalEmployees += $department->dpEmployees($department->employees);
        }
        return $totalEmployees;
        
    }
    
    public function totalCoffeConsumption()
    {
        
        $totalCoffeConsumption = 0;
        foreach ($this->departments as $department) {
            $totalCoffeConsumption += $department->dpCoffeConusmption($department->employees);
        }
        return $totalCoffeConsumption;
        
    }
    
    public function totalSalary()
    {
        
        $totalSalary = 0;
        foreach ($this->departments as $department) {
            $totalSalary += $department->dpSalary($department->employees);
        }
        return $totalSalary;
        
    }
    
    public function totalReports()
    {
        
        $totalReports = 0;
        foreach ($this->departments as $department) {
            $totalReports += $department->dpReports($department->employees);
        }
        return $totalReports;
        
    }
    
    public function totalMainReports()
    {
        
        $totalMainReports = 0;
        foreach ($this->departments as $department) {
            $totalMainReports += $department->dpMainReports($department->employees);
        }
        return $totalMainReports;
        
    }
    
    public function totalBlueprints()
    {
        
        $totalBlueprints = 0;
        foreach ($this->departments as $department) {
            $totalBlueprints += $department->dpBlueprints($department->employees);
        }
        return $totalBlueprints;
        
    }
    
    public function avarageEmployees()
    {
          
             return $avarageEmployees = totalEmployees($this->departments) / count($this->departments);
         
    }
   
}

class Department
{
    
    var $employees = [];
    
    function __construct($name, $employees) 
    {
    
        $this->name = $name;
        $this->employees = $employees;
        
    }
    
    public function  dpEmployees()
    {
        
        return count($this->employees);
        
    }

        public function dpCoffeConusmption ()
    {
        
        $dpCoffeConsumption = 0;
        foreach ($this->employees as $employee){
            if ($employee->isBoss == true) {
                $dpCoffeConsumption += $employee->amountOfCoffe * 2;
            } else {
                $dpCoffeConsumption += $employee->amountOfCoffe; 
            } 
        }
        return $dpCoffeConsumption;
        
    }
    
    public function dpSalary ()
    {
        
        $dpSalary = 0;
        foreach ($this->employees as $employee) {
            if ($employee->rank == 3) {
                $dpSalary += $employee->baseSalary + ($employee->baseSalary * 0.5);
            } elseif ($employee->rank == 2) {
                $dpSalary += $employee->baseSalary + ($employee->baseSalary * 0.25);
            } else {
                $dpSalary += $employee->baseSalary;
            }
        }
        return $dpSalary;
    }
    
    public function  dpReports ()
    {
        
        $dpReports = 0;
        foreach ($this->employees as $employee) {
            $dpReports += $employee->reports;
        }
        return $dpReports;
    }
    
    public function  dpBlueprints ()
    {
        
        $dpBlueprints = 0;
        foreach ($this->employees as $employee) {
            $dpBlueprints += $employee->blueprints;
        }
        return $dpBlueprints;
    }
    
    public function  dpMainReports ()
    {
        
        $dpMainReports = 0;
        foreach ($this->employees as $employee) {
            $dpMainReports += $employee->mainReports;
        }
        return $dpMainReports;
    }
   
    
  
         
}

class Employee
{
     function __construct ($rank, $isBoss)
    {
        $this->isBoss = $isBoss;
        $this->rank = $rank;
     
    }

    public $amountOfCoffe;
    public $baseSalary;
    public $reports;
    public $mainReports;
    public $blueprints;
    
}

class Manager extends Employee
{
    
    public $baseSalary = 500;
    public $amountOfCoffe = 25;
    public $reports = 200;
    
}

class Engeneer extends Employee
{
    
    public $baseSalary = 200;
    public $amountOfCoffe = 5;
    public $blueprints = 50;
    
}

class Marketolog extends Employee
{
    
    public $baseSalary = 400;
    public $amountOfCoffe = 20;
    public $reports = 150;
    
}

class Analyst extends Employee
{
    
    public $baseSalary = 800;
    public $amountOfCoffe = 45;
    public $mainReports = 5;
    
}


$pdEmployees = [
    $pdBoss = new Manager(2, true),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(1, false),
    $pdMe = new Manager(2, false),
    $pdMe = new Manager(2, false),
    $pdMe = new Manager(2, false),
    $pdMe = new Manager(3, false),
    $pdMe = new Manager(3, false),
];
$sdEmployees = [
    $sdBoss = new Marketolog(2, true),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMe = new Manager(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdMa = new Marketolog(1, false),
    $sdAn = new Analyst(1, false),
];
$mdEmployees = [
    $mdBoss = new Marketolog(3, true),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(1, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMa = new Marketolog(2, false),
    $mdMe = new Manager(1, false),
    $mdMe = new Manager(1, false),
    $mdMe = new Manager(1, false),
    $mdMe = new Manager(1, false),
    $mdMe = new Manager(1, false),
    $mdMe = new Manager(1, false),
    $mdMe = new Manager(1, false),
    $mdMe = new Manager(1, false),
    $mdEn = new Engeneer(1, false),
    $mdEn = new Engeneer(1, false),
    $mdEn = new Engeneer(1, false),
    $mdEn = new Engeneer(1, false),
    $mdEn = new Engeneer(1, false),
];
$ldEmployees = [
    $ldBoss = new Manager(1, true),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(1, false),
    $ldMe = new Manager(2, false),
    $ldMe = new Manager(2, false),
    $ldMe = new Manager(2, false),
    $ldMe = new Manager(2, false),
    $ldMe = new Manager(2, false),
    $ldEn = new Engeneer(1, false),
    $ldEn = new Engeneer(1, false),
    $ldEn = new Engeneer(1, false),
    $ldEn = new Engeneer(1, false),
    $ldEn = new Engeneer(1, false), 
];
$pdDepartment = new Department("Purchase", $pdEmployees);
$mdDepartment = new Department("Marketing", $mdEmployees);
$sdDepartment = new Department("Sellers", $sdEmployees);
$ldDepartment = new Department("Logistic", $ldEmployees);


$departments = [$pdDepartment, $sdDepartment, $mdDepartment, $ldDepartment];

$company = new Company($departments);


foreach ($departments as $department){
echo $department->name . "Department" . "\n" .
     "Employees: " . $department->dpEmployees() . "\n" .   
     "Coffe: " . $department->dpCoffeConusmption() . "\n" .
     "Salary: " . $department->dpSalary() . "\n" .
     "Reports: " . $department->dpReports() . "\n" .
     "MainReports: " . $department->dpMainReports() . "\n" .
     "Blueprints: " . $department->dpBlueprints() . "\n" ;
   
echo str_repeat("__", 30) . "\n";
}

echo "Total Employees: " . $company->totalEmployees($departments) . "\n" . 
     "Total coffe: " . $company->totalCoffeConsumption($departments) . "\n" .
     "Total salary: " . $company->totalSalary($departments) . "\n" .
     "Total reports: " . $company->totalReports($departments) . "\n" .
     "Total main reports: " . $company->totalMainReports($departments) . "\n" .
     "Total blueprints: " . $company->totalBlueprints($departments) . "\n";

echo str_repeat("__", 30) . "\n";

echo "Avarage Employees: " . round($company->totalEmployees($departments) / count($departments), 2) . "\n" . 
     "Avarage coffe: " . round($company->totalCoffeConsumption($departments) / count($departments), 2) . "\n" .
     "Avarage salary: " . round($company->totalSalary($departments) / count($departments), 2) . "\n" .
     "Avarage reports: " . round($company->totalReports($departments) / count($departments), 2) . "\n" .
     "Avarage main reports: " . round($company->totalMainReports($departments) / count($departments), 2) . "\n" .
     "Avarage blueprints: " . round($company->totalBlueprints($departments) / count($departments), 2) . "\n";
  