<?php
require_once 'Worker.php';;
require_once 'WorkGroup.php';
require_once 'WorkGroupIterator.php';
require_once 'NullWorkGroupIterator.php';

use \Main\CompositePattern\Worker;
use \Main\CompositePattern\WorkGroup;

$hoursWorked = 3;

// Create WorkGroup and add workers to it
// then calculate the costs.
$workers = new WorkGroup(null);
$workers->Add(new Worker("Fred", 12.10));
$workers->Add(new Worker("Bob", 13.11));

$totalCost = $workers->CalculateCost($hoursWorked);
echo "Cost so far is " . number_format($totalCost, 2) . "<br/>";

// You can also add WorkGroups to WorkGroups
$group = new WorkGroup(null);
$group->Add(new Worker("Jill", 15.15));
$group->Add(new Worker("Sarah", 24.30));
$group->Add(new Worker("Karen", 13.40));
$workers->Add($group);

$totalCost = $workers->CalculateCost($hoursWorked);
echo "Cost so far is " . number_format($totalCost, 2) . "<br/>";

// ... and sub groups, etc, etc.
$subgroup = new WorkGroup(null);
$subgroup->Add(new Worker("Tom", 25.40));
$subgroup->Add(new Worker("Dick", 24.56));
$subgroup->Add(new Worker("Harry", 29.89));
$group->Add($subgroup);

$totalCost = $workers->CalculateCost($hoursWorked);
echo "Cost so far is " . number_format($totalCost, 2) . "<br/>";

// You can also recursively read through all the workers
// in all the workgroups.
DisplayWorkerCostings($workers, $hoursWorked);

// I've setup the constructor on WorkGroup so you can
// pass in arrays of Workers and WorkGroup.
$workers = new WorkGroup([
		new Worker("Bob", 32.90),
		new WorkGroup([
					new Worker("Tom", 34.10),
					new Worker("Dick", 31.89),
					new WorkGroup([
							new Worker("Frank", 32.78),
							new WorkGroup([
								new Worker("Jill", 34.59),
								new Worker("Bill", 37.68)
							]),
							new Worker("Sarah", 38.95),
							new WorkGroup([
								new Worker("Milly", 35.78),
								new Worker("Tilly", 32.56)
							]),
						]),
					new Worker("Harry", 34.59)
				]),
		new Worker("Steve", 39.99)
	]);

DisplayWorkerCostings($workers, $hoursWorked);
echo "Cost so far is " . number_format($totalCost, 2) . "<br/>";


// Function for displaying all Worker costs
function DisplayWorkerCostings($workgroup, $hoursWorked)
{
	$iter = $workgroup->Iterator;
	
	foreach($iter as $worker)
	{
		// Check it's not a WorkGroup
		if(is_null($worker->GetGroup()) == true)
		{
			echo "Worker {$worker->Name} cost {$worker->CalculateCost($hoursWorked)}<br/>";
		}
		else 
		{
			echo "Subtotal {$worker->CalculateCost($hoursWorked)}<br/>";	
		}
	}
}
?>