<?php //департаменты и сотрудники
 

error_reporting(-1);
mb_internal_encoding('utf-8');
	

$departmentNames = array("закупок","продаж","рекламы","логистики");

$listOfWorkersDep["закупок"] = array("ме1"=>9,"ме2"=>3,"ме3"=>2,
								"ма1"=>2,"ма2"=>0,"ма3"=>0,
								"ин1"=>0,"ин2"=>0,"ин3"=>0,
								"аа1"=>0,"ан2"=>0,"ан3"=>0);
$listOfWorkersDep["продаж"] = array("ме1"=>12,"ме2"=>0,"ме3"=>0,
								"мар1"=>6,"ма2"=>0,"ма3"=>0,
								"ин1"=>0,"ин2"=>0,"ин3"=>0,
								"ан1"=>3,"ан2"=>2,"ан3"=>0);
$listOfWorkersDep["рекламы"] = array("ме1"=>8,"ме2"=>0,"ме3"=>0,
								"ма1"=>15,"ма2"=>10,"ма3"=>0,
								"ин1"=>2,"ин2"=>0,"ин3"=>0,
								"ан1"=>0,"ан2"=>0,"ан3"=>0);
$listOfWorkersDep["логистики"] = array("ме1"=>13,"мен2"=>5,"ме3"=>0,
								"мар1"=>0,"ма2"=>0,"ма3"=>0,
								"ин1"=>5,"ин2"=>0,"ин3"=>0,
								"ан1"=>0,"ан2"=>0,"ан3"=>0);



class Department 
{
	protected $name;
	protected $listOfWorkers = array();
	protected $numberOfWorkers = 0;
	
	
	public function __construct( $name )
	{
		$this->name = $name;
	}
	
	public function addWorker( Worker $newWorker )
	{
		$this->listOfWorkers[] = $newWorker;
		$this->numberOfWorkers++;
	}
	
	public function getName()
	{
		return $this->name;
	}
	
	public function summonWorkers( $quantity, $type, $rank, $leadership )
	{
		$list = array();
		for( $i=0;$i<$quantity;$i++ )
		{
			switch($type)
			{
				case 1: 
					$this->listOfWorkers[] = new Manager( $this, $rank, $leadership );
				case 2: 
					$this->listOfWorkers[] = new Marketer( $this, $rank, $leadership );
				case 3:
					$this->listOfWorkers[] = new Engineer( $this, $rank, $leadership );
				case 4:
					$this->listOfWorkers[] = new Analyst( $this, $rank, $leadership );
			}
		}
	}
	
	public function getWorkersInfos()
	{
		foreach( $this->listOfWorkers as $number=>$worker )
		{
			$worker->getInfos();
		}
	}
	
	public function getTotalWorkers()
	{
		return $this->numberOfWorkers;
	}
	
	public function getTotalSalary()
	{
		$totalSalary = 0;
		foreach( $this->listOfWorkers as $number=>$worker )
		{
			$totalSalary += $worker->getSalary();
		}
		return $totalSalary;
	}
	
	public function getTotalCoffeeConsumption()
	{
		$totalCoffee = 0;
		foreach( $this->listOfWorkers as $number=>$worker )
		{
			$totalCoffee += $worker->getCoffeeConsumption();
		}
		return $totalCoffee;
	}
	
	public function getTotalProduction()
	{
		$totalProduction = 0;
		foreach( $this->listOfWorkers as $number=>$worker )
		{
			$totalProduction += $worker->getProduction();
		}
		return $totalProduction;
	}

	public function getDepartmentInfos()
	{
		return array($this->name,
					$this->getTotalWorkers(),
					$this->getTotalSalary(),
					$this->getTotalCoffeeConsumption(),
					$this->getTotalProduction(),
					round($this->getTotalSalary()/$this->getTotalProduction(),2));
	}
}

abstract class 	Worker
{
	protected $department;	
	protected $rank;
	protected $isChief;
	protected $baseSalary;
	protected $coffeeConsumptionRate;
	protected $productionPerMount;
	protected $productionType;
	
	public function __construct( Department $department, $rank, $chief )
	{
		$this->department = $department->getName();
		$this->rank = $rank;
		$this->isChief = $chief;
		$department->addWorker($this);
	}
	
	public function getCoffeeConsumption()
	{
		if ( $this->isChief )
		{
			$coffee = $this->coffeeConsumptionRate*2;
		}
		else
		{
			$coffee = $this->coffeeConsumptionRate;
		}
		return $coffee;
	}
	
	public function getSalary()
	{
		switch( $this->rank )
		{
			case 1:
				$salary = $this->baseSalary;
				break;
			case 2:
				$salary = $this->baseSalary*1.25;
				break;
			case 3: 
				$salary = $this->baseSalary*1.5;
				break;
		}
		
		if( $this->isChief )
		{
			$salary*= 1.5;
		}
		
		return $salary;
	}
	
	public function getProduction()
	{
		return $this->productionPerMount;
	}
	
	public function getInfos()
	{
		echo $this->rank;
		echo "-го уровня "; 
		if ($this->isChief)
		{
			echo "и начальник ";
		}
		echo "департамента ";
		echo $this->department;
		echo ", зарплата ";
		echo $this->getSalary();
		echo " тугриков в месяц, выпивает ";
		echo $this->getCoffeeConsumption();
		echo " литров кофе в месяц\n";
	}
}

class Manager extends Worker
{
	protected $coffeeConsumptionRate = 20;
	protected $baseSalary = 500;
	protected $productionPerMount = 200;
	protected $productionType = "страница отчёта";

	public function getInfos()
	{
		echo "Это менеджер ";
		parent::getInfos();
	}
}

class Marketer extends Worker
{
	protected $coffeeConsumptionRate = 15;
	protected $baseSalary = 400;
	protected $productionPerMount = 150;
	protected $productionType = "страница отчёта";
	
	public function getInfos()
	{
		echo "Это маркетолог ";
		parent::getInfos();
	}
}

class Engineer extends Worker
{
	protected $coffeeConsumptionRate = 5;
	protected $baseSalary = 200;
	protected $productionPerMount = 50;
	protected $productionType = "страница чертёжа";
	
	public function getInfos()
	{
		echo "Это инженер ";
		parent::getInfos();
	}
}

class Analyst extends Worker
{
	protected $coffeeConsumptionRate = 50;
	protected $baseSalary = 800;
	protected $productionPerMount = 5;
	protected $productionType = "стратегическое исследование";
	
	public function getInfos()
	{
		echo "Это аналитик ";
		parent::getInfos();
	}
}


function padLeft( $string,$columns )
{
	return str_repeat(" ",$columns-mb_strlen($string)).$string;
}

function printInfos( $arrayOfSomething,$columns )
{
	foreach( $arrayOfSomething as $number=>$data )
	{
		echo padLeft( $data,$columns );
	}
	echo "\n";
}




$departmentList = array();
foreach( $departmentNames as $i=>$name )
{
	$departmentList[$name] = new Department($name);
}

foreach( $departmentNames as $i=>$name )										//вносим работников в департаменты
{
	$workers = $listOfWorkersDep[$name];
	foreach( $workers as $key=>$num)
	{
		if ( $num > 0 )
		{
			switch($key)
			{
				case "ме1":
					for ( $i=0;$i<$num;$i++ )
					{
						new Manager( $departmentList[$name], 1, false );
					}
					break;
				case "ме2":
					for ( $i=0;$i<$num;$i++ )
					{
						new Manager( $departmentList[$name], 2, false );
					}
					break;
				case "ме3":
					for ( $i=0;$i<$num;$i++ )
					{
						new Manager( $departmentList[$name], 3, false );
					}
					break;
				case "ма1":
					for ( $i=0;$i<$num;$i++ )
					{
						new Marketer( $departmentList[$name], 1, false );
					}
					break;
				case "ма2":
					for ( $i=0;$i<$num;$i++ )
					{
						new Marketer( $departmentList[$name], 2, false );
					}
					break;
				case "ма3":
					for ( $i=0;$i<$num;$i++ )
					{
						new Marketer( $departmentList[$name], 3, false );
					}
					break;
				case "ин1":
					for ( $i=0;$i<$num;$i++ )
					{
						new Engineer( $departmentList[$name], 1, false );
					}
					break;
				case "ин2":
					for ( $i=0;$i<$num;$i++ )
					{
						new Engineer( $departmentList[$name], 2, false );
					}
					break;
				case "ин3":
					for ( $i=0;$i<$num;$i++ )
					{
						new Engineer( $departmentList[$name], 3, false );
					}
					break;
				case "ан1":
					for ( $i=0;$i<$num;$i++ )
					{
						new Analyst( $departmentList[$name], 1, false );
					}
					break;
				case "ан2":
					for ( $i=0;$i<$num;$i++ )
					{
						new Analyst( $departmentList[$name], 2, false );
					}
					break;
				case "ан3":
					for ( $i=0;$i<$num;$i++ )
					{
						new Analyst( $departmentList[$name], 3, false );
					}
					break;
			}
		}
	}
}

//добавляем начальников департаментов
new Manager( $departmentList["закупок"], 2, true );
new Marketer( $departmentList["продаж"], 2, true );
new Marketer( $departmentList["рекламы"], 3, true );
new Manager( $departmentList["логистики"], 1, true );



printInfos(array("Департамент","Работников","Зарплата","Расход кофе","Результат(стр)","Расход на стр"),15);

foreach( $departmentNames as $i=>$name )
{
	$arrayOfInfos[$i]=$departmentList[$name]->getDepartmentInfos();
	printInfos($arrayOfInfos[$i],15);
}

$totalInfos = array("итого",0,0,0,0,0);

foreach( $arrayOfInfos as $key=>$data )
{
	for( $i=1;$i<6;$i++ )
	{
		$totalInfos[$i] += $data[$i];
	}
}

$totalInfos[5] = round($totalInfos[2]/$totalInfos[4],2);

printInfos($totalInfos,15);





