<?php
/**
 * Header Content Renderer.
 *
 * @package customizer-builder
 */
namespace RISHI\Customizer\Header;
/**
 *
 */
class Render extends \Rishi_Builder_Render {

	public function get_section_type() {
		return 'header';
	}

	public function get_header_height( $sticky_height = false ) {
		$top_row    = $this->get_item_data_for( 'top-row' );
		$middle_row = $this->get_item_data_for( 'middle-row' );
		$bottom_row = $this->get_item_data_for( 'bottom-row' );

		$top_row_height = rishi__cb_get_akv(
			'headerRowHeight',
			$top_row,
			array(
				'mobile'  => 50,
				'tablet'  => 50,
				'desktop' => 50,
			)
		);

		$middle_row_height = rishi__cb_get_akv(
			'headerRowHeight',
			$middle_row,
			array(
				'mobile'  => 70,
				'tablet'  => 70,
				'desktop' => 120,
			)
		);

		$bottom_row_height = rishi__cb_get_akv(
			'headerRowHeight',
			$bottom_row,
			array(
				'mobile'  => 80,
				'tablet'  => 80,
				'desktop' => 80,
			)
		);

		if ( $sticky_height ) {
			if (
				$sticky_height['behaviour'] === 'middle'
				||
				$sticky_height['behaviour'] === 'middle_bottom'
				||
				$sticky_height['behaviour'] === 'bottom'
			) {
				$top_row_height = array(
					'mobile'  => 0,
					'tablet'  => 0,
					'desktop' => 0,
				);
			}

			if (
				$sticky_height['behaviour'] === 'top'
				||
				$sticky_height['behaviour'] === 'bottom'
			) {
				$middle_row_height = array(
					'mobile'  => 0,
					'tablet'  => 0,
					'desktop' => 0,
				);
			} else {
				if ( rishi__cb_get_akv( 'has_sticky_shrink', $middle_row, 'no' ) === 'yes' ) {
					$middle_row_shrink = rishi__cb_customizer_expand_responsive_value(
					 rishi__cb_get_akv(
							'stickyHeaderRowShrink',
							$middle_row,
							70
						)
					);

					$middle_row_height = array(
						'mobile'  => intval( $middle_row_shrink['mobile'] ) * intval( $middle_row_height['mobile'] ) / 100,
						'tablet'  => intval( $middle_row_shrink['tablet'] ) * intval( $middle_row_height['tablet'] ) / 100,
						'desktop' => intval( $middle_row_shrink['desktop'] ) * intval( $middle_row_height['desktop'] ) / 100,
					);
				}
			}

			if (
				$sticky_height['behaviour'] === 'middle'
				||
				$sticky_height['behaviour'] === 'top_middle'
				||
				$sticky_height['behaviour'] === 'top'
			) {
				$bottom_row_height = array(
					'mobile'  => 0,
					'tablet'  => 0,
					'desktop' => 0,
				);
			}
		}

		$is_row_empty_mobile  = $this->is_row_empty( 'top-row', 'mobile' );
		$is_row_empty_desktop = $this->is_row_empty( 'top-row', 'desktop' );

		if ( $is_row_empty_mobile ) {
			$top_row_height['mobile'] = 0;
			$top_row_height['tablet'] = 0;
		}

		if ( $is_row_empty_desktop ) {
			$top_row_height['desktop'] = 0;
		}

		$is_row_empty_mobile  = $this->is_row_empty( 'middle-row', 'mobile' );
		$is_row_empty_desktop = $this->is_row_empty( 'middle-row', 'desktop' );

		if ( $is_row_empty_mobile ) {
			$middle_row_height['mobile'] = 0;
			$middle_row_height['tablet'] = 0;
		}

		if ( $is_row_empty_desktop ) {
			$middle_row_height['desktop'] = 0;
		}

		$is_row_empty_mobile  = $this->is_row_empty( 'bottom-row', 'mobile' );
		$is_row_empty_desktop = $this->is_row_empty( 'bottom-row', 'desktop' );

		if ( $is_row_empty_mobile ) {
			$bottom_row_height['mobile'] = 0;
			$bottom_row_height['tablet'] = 0;
		}

		if ( $is_row_empty_desktop ) {
			$bottom_row_height['desktop'] = 0;
		}

		return array(
			'mobile'  => intval( $top_row_height['mobile'] ) + intval(
				$middle_row_height['mobile']
			) + intval( $bottom_row_height['mobile'] ),
			'tablet'  => intval( $top_row_height['tablet'] ) + intval(
				$middle_row_height['tablet']
			) + intval( $bottom_row_height['tablet'] ),
			'desktop' => intval( $top_row_height['desktop'] ) + intval(
				$middle_row_height['desktop']
			) + intval( $bottom_row_height['desktop'] ),
		);
	}

	public function contains_item( $item, $is_primary = false ) {
		if ( is_customize_preview() ) {
			return true;
		}

		if ( $is_primary ) {
			if ( $item === 'offcanvas' ) {
				return ! $this->is_row_empty( $item, 'mobile' );
			}

			return ( ! $this->is_row_empty( $item, 'desktop' )
			||
			! $this->is_row_empty( $item, 'mobile' ) );
		}

		$section = $this->get_current_section();

		foreach ( $section['desktop'] as $desktop_row ) {
			foreach ( $desktop_row['placements'] as $single_placement ) {
				if ( in_array( $item, $single_placement['items'] ) ) {
					return true;
				}
			}
		}

		foreach ( $section['mobile'] as $mobile_row ) {
			foreach ( $mobile_row['placements'] as $single_placement ) {
				if ( in_array( $item, $single_placement['items'] ) ) {
					return true;
				}
			}
		}

		return false;
	}

	public function render() {
		$content  = $this->render_for_device( 'desktop' );
		$content .= $this->render_for_device( 'mobile' );

		$current_section = $this->get_current_section();

		if ( ! isset( $current_section['settings'] ) ) {
			$current_section['settings'] = array();
		}

		$atts = $current_section['settings'];

		return rishi__cb_html_tag(
			'header',
			apply_filters(
				'rishi:header:wrapper-attr',
				array_merge(
					array(
						'id'      => 'header',
						'class'   => 'site-header',
						'data-id' => $this->get_short_section_id(),
					),
				 rishi__cb_customizer_schema_org_definitions( 'header', array( 'array' => true ) )
				),
				array(
					'atts'            => $atts,
					'current_section' => $current_section,
				)
			),
			$content
		);
	}

	public function render_for_device( $device ) {
		$rows = array();

		$current_section = $this->get_current_section();
		$current_layout  = $current_section[ $device ];

		foreach ( $current_layout as $row ) {
			if ( $row['id'] === 'offcanvas' ) {
				continue;
			}

			$rendered_row = $this->render_row(
				$row,
				array(
					'device' => $device,
				)
			);

			if ( ! empty( trim( $rendered_row ) ) ) {
				$rows[ $row['id'] ] = $rendered_row;
			}
		}

		$custom_content = apply_filters(
			'rt:header:rows-render',
			null,
			$rows,
			$device
		);

		if ( $custom_content ) {
			$content = $custom_content;
		} else {
			$content = implode( '', array_values( $rows ) );
		}

		return rishi__cb_html_tag(
			'div',
			apply_filters(
				'rt:header:device-wrapper-attr',
				array( 'data-device' => $device ),
				$device
			),
			$content
		);
	}

	public function render_row( $row, $args = array() ) {
		$args = wp_parse_args(
			$args,
			array(
				'device' => 'desktop',
			)
		);

		$atts = $this->get_item_data_for( $row['id'] );
		$hide_row = rishi__cb_customizer_default_akg('header_hide_row', $atts, false );

		if ( $this->is_row_empty( $row ) || $hide_row ) {
			return '';
		}

		$row_config = $this->get_item_config_for( $row['id'] );

		$simplified_id = str_replace(
			'-row',
			'',
			$row['id']
		);

		$container_class = apply_filters( 'rishi__cb_header_container_class', 'customizer_builder__container');

		if ( rishi__cb_customizer_default_akg( 'headerRowWidth', $atts, 'fixed' ) !== 'fixed' ) {
			$container_class = 'cb__container-fluid';
		}

		$start_placement  = $this->render_start_placement(
			$row,
			array(
				'device' => $args['device'],
			)
		);
		$middle_placement = $this->render_middle_placement(
			$row,
			array(
				'device' => $args['device'],
			)
		);
		$end_placement    = $this->render_end_placement(
			$row,
			array(
				'device' => $args['device'],
			)
		);

		$count = 0;

		if ( ! empty( trim( $start_placement ) ) ) {
			$count++;
		}

		if ( ! empty( trim( $middle_placement ) ) ) {
			$count++;
		}

		if ( ! empty( trim( $end_placement ) ) ) {
			$count++;
		}

		$attr = array(
			'data-row'        => $simplified_id,
			'data-column-set' => $count,
		);

		$middle = $this->get_placement_by( $row, 'middle' );

		if ( in_array( 'search-input', $middle['items'] ) ) {
			$attr['data-middle'] = 'search-input';
		}

		$row_container_attr = apply_filters(
			'rishi:header:row-wrapper-attr',
			array_merge(
				$attr,
				( is_customize_preview() ? array(
					'data-item-label' => $row_config['config']['name'],
					'data-shortcut'   => 'border',
					'data-location'   => $this->get_customizer_location_for(
						$row['id']
					),
				) : array() )
			),
			$row,
			$args['device']
		);

		$result  = '<div ' . rishi__cb_customizer_attr_to_html( $row_container_attr ) . '>';
		$result .= '<div ' . rishi__cb_customizer_attr_to_html(
			array_merge(
				array(
					'class' => $container_class,
				)
			)
		) . '>';

		$result .= $start_placement;
		$result .= $middle_placement;
		$result .= $end_placement;

		$result .= '</div>';
		$result .= '</div>';

		return $result;
	}

	public function render_single_item( $item_id, $args = array() ) {
		$args = wp_parse_args(
			$args,
			array(
				'device'      => 'desktop',
				'render_args' => array(),
			)
		);

		$item = null;

		$registered_items = rishi__cb_customizer_manager()->builder->get_registered_items_by( 'header' );

		foreach ( $registered_items as $single_item ) {
			if ( $single_item['id'] === $this->get_original_id( $item_id ) ) {
				$item = $single_item;
				break;
			}
		}

		$not_registered_label = sprintf(
			// translated: %s is the panel builder item ID that is missing
			__( 'Item %s not registered or doesn\'t have a view.php file.', 'rishi' ),
			$item_id
		);

		if ( ! $item ) {
			return $not_registered_label;
		}

		$render_args = apply_filters(
			'rishi:header:item-template-args',
			array(
				'panel_type'  => 'header',
				'atts'        => $this->get_item_data_for( $item_id ),
				'section_id'  => $this->get_current_section_id(),
				'attr'        => array_merge(
					array(
						'data-id' => $this->shorten_id( $item_id ),
					),
					( is_customize_preview() ? array(
						'data-item-label' => $item['config']['name'],
						'data-shortcut'   => $item['config']['shortcut_style'],
						'data-location'   => $this->get_customizer_location_for( $item_id ),
					) : array() )
				),
				'device'      => $args['device'],
				'render_args' => $args['render_args'],
			)
		);

		return rishi__cb_customizer_render_view(
			apply_filters(
				'rishi:header:item-view-path:' . $item_id,
				$item['path'] . '/view.php'
			),
			$render_args,
			$not_registered_label
		);
	}

	private function render_start_placement( $row, $args = array() ) {
		$args = wp_parse_args(
			$args,
			array(
				'device' => 'desktop',
			)
		);

		$placement = $this->get_placement_by( $row, 'start' );

		$middle_placement = $this->get_placement_by( $row, 'middle' );
		$end_placement    = $this->get_placement_by( $row, 'end' );
		$start_secondary  = $this->get_placement_by( $row, 'start-middle' );
		$end_secondary    = $this->get_placement_by( $row, 'end-middle' );

		if ( ! $placement ) {
			return '';
		}

		if ( $start_secondary && $end_secondary && $end_placement ) {
			if (
				count( $start_secondary['items'] ) === 0
				&&
				count( $end_secondary['items'] ) === 0
				&&
				count( $placement['items'] ) === 0
				&&
				count( $end_placement['items'] ) === 0
			) {
				return '';
			}
		}

		if ( $middle_placement && $end_placement ) {
			if (
				count( $middle_placement['items'] ) === 0
				&&
				count( $placement['items'] ) === 0
			) {
				return '';
			}
		}

		$secondary_output = '';
		$primary_output   = '';

		if ( count( $placement['items'] ) > 0 ) {
			$primary_output = rishi__cb_html_tag(
				'div',
				array(
					'data-items' => 'primary',
				),
				$this->render_items_collection(
					$placement['items'],
					array(
						'device' => $args['device'],
					)
				)
			);
		}

		if (
			$middle_placement
			&&
			$start_secondary
			&&
			count( $middle_placement['items'] ) > 0
			&&
			count( $start_secondary['items'] ) > 0
		) {
			$secondary_output = rishi__cb_html_tag(
				'div',
				array(
					'data-items' => 'secondary',
				),
				$this->render_items_collection( $start_secondary['items'] )
			);
		}

		$count = 0;

		if ( ! empty( trim( $primary_output ) ) ) {
			$count++;
		}

		if ( ! empty( trim( $secondary_output ) ) ) {
			$count++;
		}

		return rishi__cb_html_tag(
			'div',
			array_merge(
				array(
					'data-column' => 'start',
				),
				( $count > 0 ? array(
					'data-placements' => $count,
				) : array() )
			),
			$primary_output . $secondary_output
		);
	}

	private function render_middle_placement( $row, $args = array() ) {
		$args = wp_parse_args(
			$args,
			array(
				'device' => 'desktop',
			)
		);

		$placement = $this->get_placement_by( $row, 'middle' );

		if ( ! $placement ) {
			return '';
		}

		if ( count( $placement['items'] ) === 0 ) {
			return '';
		}

		return rishi__cb_html_tag(
			'div',
			array( 'data-column' => 'middle' ),
			rishi__cb_html_tag(
				'div',
				array( 'data-items' => '' ),
				$this->render_items_collection(
					$placement['items'],
					array(
						'device' => $args['device'],
					)
				)
			)
		);
	}

	private function render_end_placement( $row, $args = array() ) {
		$args = wp_parse_args(
			$args,
			array(
				'device' => 'desktop',
			)
		);

		$placement = $this->get_placement_by( $row, 'end' );

		$middle_placement = $this->get_placement_by( $row, 'middle' );
		$start_placement  = $this->get_placement_by( $row, 'start' );
		$start_secondary  = $this->get_placement_by( $row, 'start-middle' );
		$end_secondary    = $this->get_placement_by( $row, 'end-middle' );

		if ( ! $placement ) {
			return '';
		}

		if ( $start_secondary && $end_secondary && $start_placement ) {
			if (
				count( $start_secondary['items'] ) === 0
				&&
				count( $end_secondary['items'] ) === 0
				&&
				count( $placement['items'] ) === 0
				&&
				count( $start_placement['items'] ) === 0
			) {
				return '';
			}
		}

		if ( $middle_placement && $start_placement ) {
			if (
				count( $middle_placement['items'] ) === 0
				&&
				count( $placement['items'] ) === 0
			) {
				return '';
			}
		}

		$secondary_output = '';
		$primary_output   = '';

		if ( count( $placement['items'] ) > 0 ) {
			$primary_output = rishi__cb_html_tag(
				'div',
				array(
					'data-items' => 'primary',
				),
				$this->render_items_collection(
					$placement['items'],
					array(
						'device' => $args['device'],
					)
				)
			);
		}

		if (
			$middle_placement
			&&
			$end_secondary
			&&
			count( $middle_placement['items'] ) > 0
			&&
			count( $end_secondary['items'] ) > 0
		) {
			$secondary_output = rishi__cb_html_tag(
				'div',
				array(
					'data-items' => 'secondary',
				),
				$this->render_items_collection(
					$end_secondary['items'],
					array(
						'device' => $args['device'],
					)
				)
			);
		}

		$count = 0;

		if ( ! empty( trim( $primary_output ) ) ) {
			$count++;
		}

		if ( ! empty( trim( $secondary_output ) ) ) {
			$count++;
		}

		return rishi__cb_html_tag(
			'div',
			array_merge(
				array(
					'data-column' => 'end',
				),
				( $count > 0 ? array(
					'data-placements' => $count,
				) : array() )
			),
			$secondary_output . $primary_output
		);
	}

	private function get_placement_by( $row, $id ) {
		foreach ( $row['placements'] as $placement ) {
			if ( $placement['id'] === $id ) {
				return $placement;
			}
		}

		return null;
	}

	public function is_row_empty( $row, $device = '' ) {
		if ( ! is_array( $row ) ) {
			$current_section = $this->get_current_section();
			$current_layout  = $current_section[ $device ];

			foreach ( $current_layout as $single_row ) {
				if ( $single_row['id'] === $row ) {
					$row = $single_row;
				}
			}
		}

		$columns_to_check = array( 'start', 'middle', 'end' );

		foreach ( $row['placements'] as $single_column ) {
			if (
			in_array( $single_column['id'], array( 'start', 'middle', 'end' ) )
			&&
			isset( $single_column['items'] )
			&&
			count( $single_column['items'] ) > 0
			) {
				return false;
			}
		}

		return true;
	}

	public function render_items_collection( $items, $args = array() ) {
		$args = wp_parse_args(
			$args,
			array(
				'device' => 'desktop',
			)
		);

		$result = '';

		foreach ( $items as $item ) {
			$result .= $this->render_single_item(
				$item,
				array(
					'device' => $args['device'],
				)
			);
		}

		return $result;
	}

	public function get_primary_item( $id ) {
		return array();
	}
}

class_alias( 'RISHI\Customizer\Header\Render', '\Rishi_Header_Builder_Render' );
