<?php

namespace Yoast\WP\SEO\Integrations\Third_Party;

use Google\Web_Stories as Google_Web_Stories;
use WP_Screen;
use WPSEO_Admin_Asset_Manager;
use Yoast\WP\SEO\Conditionals\Web_Stories_Conditional;
use Yoast\WP\SEO\Integrations\Front_End_Integration;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Models\Indexable;

/**
 * Web Stories integration.
 */
class Web_Stories implements Integration_Interface {

	/**
	 * The front end integration.
	 *
	 * @var Front_End_Integration
	 */
	protected $front_end;

	/**
	 * Returns the conditionals based in which this loadable should be active.
	 *
	 * @return array
	 */
	public static function get_conditionals() {
		return [ Web_Stories_Conditional::class ];
	}

	/**
	 * Constructs the Web Stories integration
	 *
	 * @param Front_End_Integration $front_end The front end integration.
	 */
	public function __construct( Front_End_Integration $front_end ) {
		$this->front_end = $front_end;
	}

	/**
	 * Initializes the integration.
	 *
	 * This is the place to register hooks and filters.
	 *
	 * @return void
	 */
	public function register_hooks() {
		\add_action( 'web_stories_story_head', [ $this, 'remove_web_stories_meta_output' ], 0 );
		\add_action( 'web_stories_story_head', [ $this->front_end, 'call_wpseo_head' ], 9 );
		\add_filter( 'wpseo_schema_article_post_types', [ $this, 'filter_schema_article_post_types' ] );
		\add_filter( 'wpseo_schema_article_type', [ $this, 'filter_schema_article_type' ], 10, 2 );
		\add_action( 'admin_enqueue_scripts', [ $this, 'dequeue_admin_assets' ] );
	}

	/**
	 * Removes Web Stories meta output.
	 *
	 * @return void
	 */
	public function remove_web_stories_meta_output() {
		$instance = Google_Web_Stories\get_plugin_instance()->discovery;
		\remove_action( 'web_stories_story_head', [ $instance, 'print_metadata' ] );
		\remove_action( 'web_stories_story_head', [ $instance, 'print_schemaorg_metadata' ] );
		\remove_action( 'web_stories_story_head', [ $instance, 'print_open_graph_metadata' ] );
		\remove_action( 'web_stories_story_head', [ $instance, 'print_twitter_metadata' ] );
		\remove_action( 'web_stories_story_head', 'rel_canonical' );
	}

	/**
	 * Removes assets for the stories editor & dashboard as they are completely custom.
	 *
	 * @return void
	 */
	public function dequeue_admin_assets() {
		$screen = \get_current_screen();

		if ( $screen instanceof WP_Screen
			&& Google_Web_Stories\Story_Post_Type::POST_TYPE_SLUG === $screen->post_type
			&& $screen->base !== 'edit'
		) {
			\wp_dequeue_script( WPSEO_Admin_Asset_Manager::PREFIX . 'post-edit' );
			\wp_dequeue_script( WPSEO_Admin_Asset_Manager::PREFIX . 'post-edit-classic' );
			\wp_dequeue_script( WPSEO_Admin_Asset_Manager::PREFIX . 'edit-page-script' );
			\wp_dequeue_script( WPSEO_Admin_Asset_Manager::PREFIX . 'quick-edit-handler' );

			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'metabox-css' );
			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'scoring' );
			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'select2' );
			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'monorepo' );
			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-css' );
			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'featured-image' );
			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'dismissible' );
			\wp_dequeue_style( WPSEO_Admin_Asset_Manager::PREFIX . 'edit-page' );
		}
	}

	/**
	 * Adds web story post type to list of which post types to output Article schema  for.
	 *
	 * @param string[] $post_types Array of post types.
	 * @return string[] Array of post types.
	 */
	public function filter_schema_article_post_types( $post_types ) {
		$post_types[] = Google_Web_Stories\Story_Post_Type::POST_TYPE_SLUG;
		return $post_types;
	}

	/**
	 * Filters Article type for Web Stories.
	 *
	 * @param string|string[] $type      The Article type.
	 * @param Indexable       $indexable The indexable.
	 * @return string|string[] Article type.
	 */
	public function filter_schema_article_type( $type, $indexable ) {
		if ( Google_Web_Stories\Story_Post_Type::POST_TYPE_SLUG !== $indexable->object_sub_type ) {
			return $type;
		}

		if ( \is_string( $type ) && $type === 'None' ) {
			return 'Article';
		}

		return $type;
	}
}
