<?php

namespace Webfan;

trait ngModuleTrait
{
	protected $_blocks = [];


	abstract public function getName(): string;


	public function __invoke(\callable|\Closure $BlocksProcessor, ?string $name = null)
	{
		$n = $name ? explode('.', $name, 2) : [$name,$name];
		$n[1] = isset($n[1]) ? $n[1] : $name;
		list($groupName, $controllerName) = $n;

		$groupName = '*' === $groupName ? null : $groupName;
		$controllerName = '*' === $controllerName ? null : $controllerName;

		foreach($this->_blocks as $type => $group){
		     foreach($group as $id => $block){
		  	      if(null === $name || null === $groupName || $type === $groupName || $type === $name || $type === $controllerName){
					  if(null === $name || null === $controllerName || $id === $controllerName || $id === $name || $id === $groupName){
					//	  array_push($blocks, $block);
						   \call_user_func_array($BlocksProcessor->bindTo($block, $this), [$block, $type, $id, $this]);
					  }
				  }
		     }
		}
		//return \call_user_func_array($BlocksProcessor, [$this->getName(), $this, $this->_blocks]);
	}


	public function __call($method, $params)
	{
		$args = $params;
		   $block = new \stdclass;
		   $block->type = $method;

		if(!isset($this->_blocks[$block->type])){
		  $this->_blocks[$block->type] = [];
		}

		if(isset($args[0]) && is_string($args[0])){
		  $block->name = array_shift($args);
		}else{
			$block->name = ucfirst($block->type).'Block'.(count($this->_blocks[$block->type]) + 1).'RandId'.mt_rand(10000,99999999);
		}

		if(isset($args[0]) && \is_callable($args[0])){
			$block->controller = array_shift($args);
			$block->inject = $args;
		}elseif(isset($args[0]) && is_array($args[0])){
			$injector = array_shift($args);
			if(\is_callable($injector[count($injector)-1])){
				$block->controller = array_pop($injector);
			}
			$block->inject = $injector;
		}else{
			$block->inject = $args;
		}


		if(!isset($block->controller)){
			$block->controller = (function($args) use(&$block){
				return $block;
			});
		}

		$block->controller = $block->controller->bindTo($block, $this);


		if(isset($this->_blocks[$block->type][$block->name])){
		   throw new \Exception('A %1$s block with the name %2$s does exist already in %3$s!', $block->type, $block->name, __METHOD__);
		}

		$this->_blocks[$block->type][$block->name] = $block;

		  return $this;
	}
}
__halt_compiler();----SIGNATURE:----kgPJGwMpFaaXRA+UNHXB9f0xOpu38qzy15gPCoBT5CxwCZFqSoDih3foYgmC9SioBXVq9blIHf1MkDGGTO6hwY/RezrrgNMx9W+aNUZz1VEamkBR1okmqtpHWz46Q6Z7S5oC2szSMHwlTTjUcGJj1d8yInY7W6HgB+qMqa6mgS4rIjRhmebKbgcRyZVNukh6pizVkl6dh75HyZIAcs8It0LZHRNTPMFh6tvG67VC0TlclXT180vk3vRV+1A2cp3Cla2adquiL525j7Lp0fHWUYCYDJBNsIOqSsAoNHlRVwcy/4pEsUVfPZFonsKopl1SODDvifPbKxgyu/a482RRhn9r3l6layY312cb6J5D7vSp16DmjVOamomDf8piaUX0M+YLbrqUvgxxHnoV62/LhHPgMPcM3ar64jlXP7vLfP6uqd2VKLtNMp+wPIXT5023O5IH4/FDyXIk5iZZEHMDsYwJTu24bPAGbnFXkVTjiNlZ0wUtxUV/JmynQKDmuT1nQCRKL9pdUVQkeBCNPiE7AtEwjqYs1RhciLtPNG9B0sKxrnyICjEkHXucadsGPEof6aqS35I1uVwL9IWDwASqzlV8qD0myt2aGcdE1il2zcQGJl8DGl6dyvlsI27zZ1HGg4Jop87EmlxDsuCuewhbIB/KdbLDczZoMzJXk4liMmI=----ATTACHMENT:----MTM1MDg4NDgyNzU5NzUwOCAyNTgyMTY4ODIzMTg5NDQgNjMxNTg3MzQ4MzcyMTI4NQ==