<?php
/**
 * Seo Optimization.
 *
 * @package visual-portfolio
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class Visual_Portfolio_SEO_Optimization
 */
class Visual_Portfolio_SEO_Optimization {
	/**
	 * Visual_Portfolio_SEO_Optimization constructor.
	 */
	public function __construct() {
		add_action( 'init', array( $this, 'init' ), 9 );
	}

	/**
	 * Initialize archive.
	 *
	 * @see __construct
	 */
	public function init() {
		add_filter( 'get_canonical_url', array( $this, 'optimize_canonical_url' ), 10, 2 );
		add_filter( 'get_shortlink', array( $this, 'optimize_shortlink' ), 10, 3 );
	}

	/**
	 * Optimize canonical URL.
	 *
	 * @param string $canonical_url - Canonical URL.
	 * @param object $post          - Current Post Object.
	 * @return string
	 */
	public function optimize_canonical_url( $canonical_url, $post ) {
		return $this->optimize_url( $canonical_url, $post->ID );
	}

	/**
	 * Optimize shortlink.
	 *
	 * @param string $shortlink   - Shortlink URL.
	 * @param int    $id          - Post ID, or 0 for the current post.
	 * @param string $context     - The context for the link. One of 'post' or 'query'.
	 * @return string
	 */
	public function optimize_shortlink( $shortlink, $id, $context ) {
		return 0 === $id && 'query' === $context ? $this->optimize_url( $shortlink, get_queried_object_id() ) : $shortlink;
	}

	/**
	 * Optimize url by supported GET variables: vp_page, vp_filter, vp_sort and vp_search.
	 *
	 * @param string $url     - Not optimized URL.
	 * @param int    $post_id - Post ID.
	 * @return string
	 */
	public function optimize_url( $url, $post_id ) {
		if (
			! Visual_Portfolio_Archive_Mapping::is_archive(
				array(
					'content_source' => 'post-based',
					'posts_source'   => 'current_query',
				),
				$post_id
			) &&
            // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			isset( $_GET ) && ! empty( $_GET )
		) {
            // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			foreach ( $_GET as $key => $value ) {
				if ( 'vp_page' === $key || 'vp_filter' === $key || 'vp_sort' === $key || 'vp_search' === $key ) {
                    // phpcs:ignore WordPress.Security.NonceVerification.Recommended
					$url = add_query_arg( array_map( 'sanitize_text_field', wp_unslash( array( $key => $value ) ) ), $url );
				}
			}
		}

		return $url;
	}
}
new Visual_Portfolio_SEO_Optimization();