<?php

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

    public function GetSalary()
    {
        switch ($this->rank) {
            case 1:
                $salary=$this->rate;
                break;
            case 2:
                $salary=$this->rate*1.25;
                break;
            case 3:
                $salary=$this->rate*1.5;
                break;
        }
        
        
        $salary=($this->isBoss==1)? $salary*1.5 : $salary;
        return $salary;
    }

    public function GetCoffe()
    {
        $coffe=($this->isBoss==1)?  get_class($this)::COFFE*2 :  get_class($this)::COFFE;
        return $coffe;
    }
    
    public function GetPages()
    {
        $pages=($this->isBoss==1)?  get_class($this)::PAGES*0 :  get_class($this)::PAGES;
        return $pages;
    }
}

class Manager extends Employee
{
    const COFFE=20;
    const PAGES=200;   
}

class Marketer extends Employee
{
    const COFFE=15;
    const PAGES=150;
}

class Engineer extends Employee
{
    const COFFE=5;
    const PAGES=50;   
}

class Analyst extends Employee
{
    const COFFE=75;
    const PAGES=5;   
}

//////////////////////////////////////////////////////////////////////////////////////////////////


abstract class AbstractDepartment
{
    public $numberOfWorkers;
    public $rank;
    public $rate;
    public $isBoss;
    public $profession;
    
    public function __construct($numberOfWorkers, $rank, $rate, $isBoss, $profession)
    {
        $this->numberOfWorkers = $numberOfWorkers;

        switch ($profession) {
          case 'Менеджер': 
          $empl=new Manager($rank, $rate, $isBoss, $profession);
          $this->rank = $empl->rank;
          $this->rate = $empl->rate;
          $this->isBoss = $empl->isBoss;
          $this->profession = $empl->profession;
          $this->obj = $empl; break;
          case 'Маркетолог':
          $empl=new Marketer($rank, $rate, $isBoss, $profession);
          $this->rank = $empl->rank;
          $this->rate = $empl->rate;
          $this->isBoss = $empl->isBoss;
          $this->profession = $empl->profession;
          $this->obj = $empl; break;
          case 'Инженер':
          $empl=new Engineer($rank, $rate, $isBoss, $profession);
          $this->rank = $empl->rank;
          $this->rate = $empl->rate;
          $this->isBoss = $empl->isBoss;
          $this->profession = $empl->profession;
          $this->obj = $empl; break;
          case 'Аналитик':
          $empl=new Analyst($rank, $rate, $isBoss, $profession);
          $this->rank = $empl->rank;
          $this->rate = $empl->rate;
          $this->isBoss = $empl->isBoss;
          $this->profession = $empl->profession;
          $this->obj = $empl; break;
          

        }
    }


    public function GetTotalWorkers($dep)
    {
        $totalWorkers=0;
        foreach ($dep as $depUnit) {
            $totalWorkers+=$depUnit->numberOfWorkers;
            
        }
        return $totalWorkers;
}
    public function GetTotalSalary($dep)
    {
        $totalSalary=0;
        foreach ($dep as $depUnit) {
         
           $totalSalary+=($depUnit->obj->GetSalary()*$depUnit->numberOfWorkers);
            
        }
        return $totalSalary;   
    }

      public function GetTotalCoffe($dep)
    {
        $totalCoffe=0;
        foreach ($dep as $depUnit) {
         
           $totalCoffe+=($depUnit->obj->GetCoffe()*$depUnit->numberOfWorkers);
            
        }
        return $totalCoffe;   
    }

    public function GetTotalPages($dep)
    {
        $totalPages=0;
        foreach ($dep as $depUnit) {
            $totalPages+=($depUnit->obj->GetPages()*$depUnit->numberOfWorkers);

            
        }
        return $totalPages;   
    }

    public function GetSalaryPerPage($dep)
    { $salaryPerPage=0;
      $salaryPerPage=round($this->GetTotalSalary($dep)/$this->GetTotalPages($dep),2);

      return $salaryPerPage;}

        
}


class BuyDepartment extends AbstractDepartment
{
public $depName='Департамент закупок';
}

class SalesDepartment extends AbstractDepartment
{
public $depName='Департамент продаж'; 
}

class AdvDepartment extends AbstractDepartment
{
public $depName='Департамент рекламы';   
}

class LogDepartment extends AbstractDepartment
{
public $depName='Департамент логистики';  
}