<?php
declare( strict_types=1 );

namespace WPDesk\Init\Binding\Loader;

use WPDesk\Init\Binding\DefinitionFactory;
use WPDesk\Init\Configuration\ReadableConfig;
use WPDesk\Init\Plugin\Plugin;

class ArrayDefinitions implements BindingDefinitions {

	/** @var array */
	private $bindings;

	/** @var DefinitionFactory */
	private $factory;

	public function __construct( array $bindings, ?DefinitionFactory $factory = null) {
		$this->bindings = $bindings;
		$this->factory  = $factory ?? new DefinitionFactory();
	}

	public function load(): iterable {
		yield from $this->normalize( $this->bindings );
	}

	private function normalize( $bindings ) {
		$normalized = [];
		foreach ( $bindings as $key => $value ) {
			if ( is_array( $value ) ) {
				foreach ( $value as $unit ) {
					yield $this->create( $unit, $key );
				}
			} else {
				yield $this->create( $value, $key );
			}
		}
	}

	private function create( $value, $hook ) {
		return $this->factory->create( $value, is_int( $hook ) ? null : $hook );
	}
}