<?php
/**
 * Canonical Meta Data
 *
 * This file will handle functionality to print meta_data in frontend for different requests.
 *
 * @package surerank
 * @since 0.0.1
 */

namespace SureRank\Inc\Frontend;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

use SureRank\Inc\Traits\Get_Instance;
use WP_Term;

/**
 * Canonical URL
 * This class will handle functionality to print meta_data in frontend for different requests.
 *
 * @since 1.0.0
 */
class Canonical {

	use Get_Instance;

	/**
	 * Constructor
	 *
	 * @since 1.0.0
	 */
	public function __construct() {
		remove_action( 'wp_head', 'rel_canonical' );
		remove_action( 'wp_head', 'index_rel_link' );
		add_action( 'surerank_print_meta', [ $this, 'print_canonical_url' ], 1, 1 );
	}

	/**
	 * Add meta data
	 *
	 * @param array<string, mixed> $meta_data Meta Data.
	 * @since 1.0.0
	 * @return void
	 */
	public function print_canonical_url( $meta_data ) {
		$url = '';
		if ( is_singular() ) {
			$url = $meta_data['canonical_url'] ?? get_the_permalink();
		}

		if ( is_archive() ) {
			$taxonomy = get_queried_object();
			if ( $taxonomy instanceof \WP_Term ) {
				$url = get_term_link( $taxonomy );
			}
		}

		if ( is_home() || is_front_page() ) {
			$url = $meta_data['canonical_url'] ?? get_home_url();
		}

		global $wp;

		if ( ! is_404() ) {
			if ( is_search() ) {
				$url = get_search_link();
			} elseif ( is_paged() && is_singular() ) {
				$url = $meta_data['canonical_url'] ?? get_permalink();
			} elseif ( is_paged() ) {
				$url = $meta_data['canonical_url'] ?? get_pagenum_link( get_query_var( 'paged' ) );
			} elseif ( is_tax() || is_category() || is_tag() ) {
				$queried_object = get_queried_object();
				$url            = isset( $meta_data['canonical_url'] ) && ! empty( $meta_data['canonical_url'] )
					? $meta_data['canonical_url']
					: ( $queried_object instanceof WP_Term ? get_term_link( $queried_object ) : '' );
			} elseif ( ! is_home() && ! is_front_page() ) {
				$url = $meta_data['canonical_url'] ?? user_trailingslashit( home_url( add_query_arg( [], $wp->request ) ) );
			}

			if ( empty( $url ) ) {
				$url = user_trailingslashit( home_url( add_query_arg( [], $wp->request ) ) );
			}
		}

		/**
		 * Filters the canonical URL before output.
		 *
		 * Allows domain-mapping integrations (WPML domain-per-language, WP Landing Kit)
		 * to supply the correctly mapped canonical URL.
		 *
		 * @since 1.7.2
		 * @param string               $url       Resolved canonical URL.
		 * @param array<string, mixed> $meta_data Post meta data for this request.
		 */
		$url = (string) apply_filters( 'surerank_canonical_url', $url, $meta_data );

		$this->print_canonical( $url );
	}

	/**
	 * Print the canonical url.
	 *
	 * @param string $url Canonical URL.
	 * @return void
	 * @since 1.0.0
	 */
	public function print_canonical( $url ) {
		echo '<link rel="canonical" href="' . esc_url( $url ) . '">' . PHP_EOL;
	}

}
