<?php
declare(strict_types=1);
namespace WP_Rocket\Engine\Common\Head;

/**
 * Element trait.
 */
trait ElementTrait {
	/**
	 * Preload link.
	 *
	 * @param array $args Element args.
	 * @return array|string[]
	 */
	protected function preload_link( array $args = [] ) {
		$args['rel'] = 'preload';
		$args[]      = 'data-rocket-preload';
		return $this->link( $args );
	}

	/**
	 * Preconnect link.
	 *
	 * @param array $args Element args.
	 * @return array|string[]
	 */
	protected function preconnect_link( array $args = [] ) {
		$args['rel'] = 'preconnect';
		return $this->link( $args );
	}

	/**
	 * Dns_prefetch link.
	 *
	 * @param array $args Element args.
	 * @return array|string[]
	 */
	protected function dns_prefetch_link( array $args = [] ) {
		$args['rel'] = 'dns-prefetch';
		return $this->link( $args );
	}

	/**
	 * Prefetch link.
	 *
	 * @param array $args Element args.
	 * @return array|string[]
	 */
	protected function prefetch_link( array $args = [] ) {
		$args['rel'] = 'prefetch';
		return $this->link( $args );
	}

	/**
	 * Prerender link.
	 *
	 * @param array $args Element args.
	 * @return array|string[]
	 */
	protected function prerender_link( array $args = [] ) {
		$args['rel'] = 'prerender';
		return $this->link( $args );
	}

	/**
	 * Stylesheet link.
	 *
	 * @param array $args Element args.
	 * @return array|string[]
	 */
	protected function stylesheet_link( array $args = [] ) {
		$args['rel'] = 'stylesheet';
		return $this->link( $args );
	}

	/**
	 * Style tag.
	 *
	 * @param string $css CSS content.
	 * @param array  $args Element args.
	 * @return array|string[]
	 */
	protected function style_tag( string $css = '', array $args = [] ) {
		$element              = [
			'open_tag' => '<style',
		];
		$element             += wp_parse_args(
			$args,
			[
				'inner_content' => $css,
			]
		);
		$element['close_tag'] = '</style>';

		return $this->prepare_element( $element );
	}

	/**
	 * Noscript tag.
	 *
	 * @param string $content Element contents.
	 * @param array  $args Element args.
	 * @return array|string[]
	 */
	protected function noscript_tag( string $content = '', array $args = [] ) {
		$element              = [
			'open_tag' => '<noscript',
		];
		$element             += wp_parse_args(
			$args,
			[
				'inner_content' => $content,
			]
			);
		$element['close_tag'] = '</noscript>';

		return $this->prepare_element( $element );
	}

	/**
	 * Generic link tag.
	 *
	 * @param array $args Element args.
	 * @return array|string[]
	 */
	private function link( array $args = [] ) {
		$element  = [
			'open_tag' => '<link',
		];
		$element += wp_parse_args(
			$args,
			[
				'href' => '',
			]
		);

		return $this->prepare_element( $element );
	}

	/**
	 * Prepare element by adding any additional attributes.
	 *
	 * @param array $element Current element.
	 *
	 * @return array
	 */
	private function prepare_element( array $element ): array {
		if ( ! rocket_get_constant( 'WP_ROCKET_DEBUG', false ) ) {
			return $element;
		}
		$element['data-rocket-feature'] = $this->feature;
		return $element;
	}
}
