<?php

namespace Andweb\Yml;
use Nette;

class DockerComposeBuilder
{
	use Nette\SmartObject;

	protected $defaults;
	protected $arr;

	public function __construct($defaults)
	{
		$this->defaults = $defaults;
	}

	public function createHeader()
	{
		$this->arr = [
			'version' => $this->defaults['version'],
			'services' => []
		];
	}


	public function createSection($data)
	{
		$containerArr    = $data['containerArr'];
		$containerArr    = $data['containerArr'];
		$networksArr     = $data['networksArr'];
		$volumesArr      = $data['volumesArr'];
		$portsArr        = $data['portsArr'];
		$environmentsArr = $data['environmentsArr'];

		// Kontejner, jmeno - unikatni
		$contName = $containerArr['name'];

		//$this->arr['services'][$contName] = [];
		$container = & $this->arr['services'][$contName];
		// image
		$container['image'] = $containerArr['image'];
		// networks
		$container['networks'] = $networksArr;
		// ports
		// doplneni defaultni hodnoty "mode"
		foreach ($portsArr as & $arr)
			$arr['mode'] = $this->defaults['ports']['mode'];
		unset($arr); // https://coderwall.com/p/qx3fpa/php-foreach-pass-by-reference-do-it-right-or-better-not-at-all
			
	
		$container['ports'] = $portsArr;
		// ports
		$container['volumes'] = $volumesArr;
		// labels
		$container['labels'] = [$this->defaults['labels']['name'] => $this->defaults['labels']['value']];
		
		// deploy
		$deploy = & $container['deploy'];
		$deploy['replicas'] = $this->defaults['deploy']['replicas'];
		$deploy['restart_policy'] = [
			'condition' => $containerArr['restart_policy'],
			'delay'     => $this->defaults['deploy']['restart_policy']['delay'],
			'window'    => $this->defaults['deploy']['restart_policy']['window'],
		];
		
		$deploy['update_config'] = $this->defaults['deploy']['update_config'];
		
		// deploy resources
		$resources = & $deploy['resources'];
		$resources['limits']['memory']       = $containerArr['quota_memory'];
		$resources['limits']['cpus']         = $containerArr['quota_cpu'];
		$resources['reservations']['cpus']   = $this->defaults['deploy']['resources']['reservations']['cpus'];
		$resources['reservations']['memory'] = $this->defaults['deploy']['resources']['reservations']['memory'];
		
		// environments
		$container['environments'] = $environmentsArr;

	}

	public function createFooter($networks)
	{
		foreach ($networks as $network)
		{
			$this->arr['networks'][$network]['external'] = $this->defaults['networks']['external'];
		}
	}


	public function getArr()
	{
		return $this->arr;
	}
}