<?php
namespace Imagify\ThirdParty\WPRocket;

use Imagify\Traits\InstanceGetterTrait;

/**
 * Compat class for WP Rocket plugin.
 *
 * @since 1.9.3
 */
class Main {
	use InstanceGetterTrait;

	/**
	 * Launch the hooks.
	 *
	 * @since 1.9.3
	 */
	public function init() {
		add_filter( 'imagify_cdn_source', [ $this, 'set_cdn_source' ] );
	}


	/** ----------------------------------------------------------------------------------------- */
	/** HOOKS =================================================================================== */
	/** ----------------------------------------------------------------------------------------- */

	/**
	 * Provide a custom CDN source.
	 *
	 * @since 1.9.3
	 *
	 * @param  array $source {
	 *     An array of arguments.
	 *
	 *     @type $name string The name of which provides the URL (plugin name, etc).
	 *     @type $url  string The CDN URL.
	 * }
	 * @return array
	 */
	public function set_cdn_source( $source ) {
		if ( ! function_exists( 'get_rocket_option' ) ) {
			return $source;
		}

		if ( ! get_rocket_option( 'cdn' ) ) {
			return $source;
		}

		$container = apply_filters( 'rocket_container', null );

		if ( is_object( $container ) && method_exists( $container, 'get' ) ) {
			try {
				// WP Rocket does not register the 'cdn' service in every context.
				if ( ! method_exists( $container, 'has' ) || $container->has( 'cdn' ) ) {
					$cdn = $container->get( 'cdn' );

					if ( $cdn && method_exists( $cdn, 'get_cdn_urls' ) ) {
						$url = $cdn->get_cdn_urls( [ 'all', 'images' ] );
					}
				}
			} catch ( \Throwable $e ) {
				// Container could not resolve or build the service: fall back to get_rocket_cdn_cnames().
				$url = null;
			}
		}

		if ( ! isset( $url ) && function_exists( 'get_rocket_cdn_cnames' ) ) {
			$url = get_rocket_cdn_cnames( [ 'all', 'images' ] );
		}

		if ( empty( $url ) ) {
			return $source;
		}

		$url = reset( $url );

		if ( ! $url ) {
			return $source;
		}

		if ( ! preg_match( '@^(https?:)?//@i', $url ) ) {
			$url = '//' . $url;
		}

		$scheme = wp_parse_url( \Imagify_Filesystem::get_instance()->get_site_root_url() );
		$scheme = ! empty( $scheme['scheme'] ) ? $scheme['scheme'] : null;
		$url    = set_url_scheme( $url, $scheme );

		$source['name'] = 'WP Rocket';
		$source['url']  = $url;

		return $source;
	}
}
