<?php

class Blocksy_Footer_Builder {
	private $default_value = null;

	private $section_value = null;
	private $current_section = null;

	public function get_default_value() {
		if ($this->default_value) {
			return $this->default_value;
		}

		$this->default_value = [
			'current_section' => 'type-1',
			'sections' => [
				$this->get_structure_for([
					'id' => 'type-1',
					'rows' => [
						'top-row' => [
							'columns' => [
								[],
								[]
							]
						],

						'middle-row' => [
							'columns' => [
								[],
								[],
								[]
							]
						],

						'bottom-row' => [
							'columns' => [
								['copyright']
							]
						],
					]
				]),

				$this->get_structure_for([
					'id' => 'type-2',
					'rows' => [
						'top-row' => [
							'columns' => [
								[],
								[]
							]
						],

						'middle-row' => [
							'columns' => [
								[],
								[],
								[],
								[]
							]
						],

						'bottom-row' => [
							'columns' => [
								['copyright']
							]
						],
					]
				])
			]
		];

		return $this->default_value;
	}

	public function enabled_on_this_page() {
		return blocksy_default_akg(
			'disable_footer',
			blocksy_get_post_options(),
			'no'
		) === 'no';
	}

	public function translation_keys() {
		$render = new Blocksy_Footer_Builder_Render();
		$sections = $render->get_section_value();

		$result = [];

		foreach ($sections['sections'] as $section) {
			foreach ($section['items'] as $item) {
				$nested_item = $render->get_item_config_for($item['id']);

				if (
					! isset($nested_item['config']['translation_keys'])
					||
					empty($nested_item['config']['translation_keys'])
				) {
					continue;
				}

				foreach ($nested_item['config']['translation_keys'] as $key) {
					if (! isset($item['values'][$key['key']])) {
						continue;
					}

					$key_prefix = 'footer:' . $section['id'] . ':' . $item['id'] . ':' . $key['key'];

					if (isset($key['all_layers'])) {
						foreach ($item['values'][$key['key']] as $single_layer) {
							foreach ($key['all_layers'] as $layer_key) {
								if (! isset($single_layer[$layer_key])) {
									continue;
								}

								$result[] = array_merge($key, [
									'key' => $key_prefix . ':' . $single_layer['id'] . ':' . $layer_key,
									'value' => $single_layer[$layer_key]
								]);
							}
						}
					} else {
						$result[] = array_merge($key, [
							'key' => $key_prefix,
							'value' => $item['values'][$key['key']]
						]);
					}
				}
			}
		}

		return $result;
	}

	public function typography_keys() {
		$render = new Blocksy_Footer_Builder_Render();
		$section = $render->get_current_section();

		$result = [];

		foreach ($section['items'] as $item) {
			$nested_item = $render->get_item_config_for($item['id']);

			if (
				! isset($nested_item['config']['typography_keys'])
				||
				empty($nested_item['config']['typography_keys'])
			) {
				continue;
			}

			$data = $render->get_item_data_for($item['id']);

			foreach ($nested_item['config']['typography_keys'] as $key) {
				$result[] = blocksy_akg($key, $data, []);
			}
		}

		return $result;
	}

	public function render() {
		if (! $this->enabled_on_this_page()) {
			return '';
		}

		$render = new Blocksy_Footer_Builder_Render();
		return $render->render();
	}

	public function get_structure_for($args = []) {
		$args = wp_parse_args($args, [
			'id' => null,
			'mode' => 'columns',
			'rows' => []
		]);

		$args['rows'] = wp_parse_args($args['rows'], [
			'top-row' => [],
			'middle-row' => [],
			'bottom-row' => [],
		]);

		$base = [
			'id' => $args['id'],
			'mode' => $args['mode'],
			'rows' => [
				$this->get_bar_structure_for(array_merge([
					'id' => 'top-row',
					'mode' => $args['mode'],
				], $args['rows']['top-row'])),
				$this->get_bar_structure_for(array_merge([
					'id' => 'middle-row',
					'mode' => $args['mode']
				], $args['rows']['middle-row'])),
				$this->get_bar_structure_for(array_merge([
					'id' => 'bottom-row',
					'mode' => $args['mode']
				], $args['rows']['bottom-row'])),
			],
			'items' => [],
			'settings' => []
		];

		return $base;
	}

	private function get_bar_structure_for($args = []) {
		$args = wp_parse_args($args, [
			'id' => null,
			'mode' => 'columns',
			'columns' => [
				/**
				 * We always have one column available
				 */
				[],
				[],
				[]
			]
		]);

		return array_merge([
			'id' => $args['id'],
			'columns' => $args['columns']
		]);
	}

	public function get_section_value() {
		if (! $this->section_value || is_customize_preview()) {
			$this->section_value = blocksy_get_theme_mod(
				'footer_placements',
				$this->get_default_value()
			);
		}

		return $this->section_value;
	}

	public function get_current_section_id() {
		return $this->get_current_section()['id'];
	}

	public function get_current_section() {
		if (! $this->current_section) {
			$this->current_section = $this->get_section_value()['sections'][0];

			foreach ($this->get_section_value()['sections'] as $single_section) {
				if ($single_section['id'] === $this->get_filtered_section_id()) {
					$this->current_section = $single_section;
					break;
				}
			}
		}

		return $this->current_section;
	}

	private function get_filtered_section_id() {
		if (
			is_customize_preview()
			&&
			isset($this->get_section_value()['__forced_static_footer__'])
		) {
			return $this->get_section_value()['__forced_static_footer__'];
		}

		return apply_filters(
			'blocksy:footer:current_section_id',
			'type-1',
			$this->get_section_value()
		);
	}

	public function patch_value_for($processed_terms) {
		$current_value = blocksy_get_theme_mod(
			'footer_placements',
			$this->get_default_value()
		);

		foreach ($current_value['sections'] as $index => $header) {
			if (! isset($header['items'])) {
				continue;
			}

			foreach ($header['items'] as $item_index => $item) {
				if (! isset($item['values'])) {
					continue;
				}

				if (! isset($item['values']['menu'])) {
					continue;
				}

				if (! isset($processed_terms[$item['values']['menu']])) {
					continue;
				}

				$current_value['sections'][$index][
					'items'
				][$item_index]['values']['menu'] = $processed_terms[$item['values']['menu']];
			}
		}

		set_theme_mod('footer_placements', $current_value);
	}
}

