<?php
/**
 * Avada Demo Import
 *
 * @package Avada-Builder
 * @since 3.5
 */

// Do not allow directly accessing this file.
if ( ! defined( 'ABSPATH' ) ) {
	exit( 'Direct script access denied.' );
}

/**
 * AWB Demo class.
 *
 * @since 3.5
 */
class AWB_Demo_Import {

	/**
	 * The one, true instance of this object.
	 *
	 * @static
	 * @access private
	 * @since 3.5
	 * @var object
	 */
	private static $instance;

	/**
	 * Location.
	 *
	 * @access private
	 * @since 3.5
	 * @var object
	 */
	private $location;

	/**
	 * URL to fetch for demo data.
	 *
	 * @access private
	 * @since 3.5
	 * @var boolean
	 */
	private $demo_url = 'https://updates.theme-fusion.com';

	/**
	 * The demo data.
	 *
	 * @access public
	 * @since 3.5
	 * @var mixed
	 */
	public $demo_data = null;

	/**
	 * URL to fetch for page data.
	 *
	 * @access private
	 * @since 3.5
	 * @var boolean
	 */
	private $page_url = 'https://avada.website';

	/**
	 * Class constructor.
	 *
	 * @since 3.5
	 * @access private
	 */
	private function __construct() {

		add_action( 'wp_ajax_awb_load_websites', [ $this, 'get_ajax_website_data' ] );
		add_action( 'wp_ajax_awb_load_websites_page', [ $this, 'load_website_page' ] );

		add_action( 'fusion_builder_load_templates', [ $this, 'library_template' ] );
		add_action( 'fusion_builder_after', [ $this, 'library_template' ] );

		$this->location = true === Fusion_App()->is_builder || ( isset( $_POST ) && isset( $_POST['fusion_front_end'] ) && $_POST['fusion_front_end'] ) ? 'front' : 'back'; // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput
	}

	/**
	 * Creates or returns an instance of this class.
	 *
	 * @static
	 * @access public
	 * @since 3.5
	 */
	public static function get_instance() {

		// If an instance hasn't been created and set to $instance create an instance and set it to $instance.
		if ( null === self::$instance ) {
			self::$instance = new AWB_Demo_Import();
		}
		return self::$instance;
	}

	/**
	 * Get the data for ajax website requests.
	 *
	 * @access public
	 * @since 3.5
	 * @return void
	 */
	public function get_ajax_website_data() {
		check_ajax_referer( 'fusion_load_nonce', 'fusion_load_nonce' );

		echo wp_json_encode( $this->get_website_data() );

		wp_die();
	}

	/**
	 * Return the demo URL.
	 *
	 * @access public
	 * @since 3.5
	 * @return string
	 */
	public function get_demo_url() {
		return $this->demo_url;
	}

	/**
	 * Get the demo data from REST endpoint.
	 *
	 * @access public
	 * @since 3.5
	 * @return array
	 */
	public function get_website_data() {
		if ( null !== $this->demo_data ) {
			return $this->demo_data;
		}

		if ( false !== get_transient( 'awb_library_demo' ) ) {
			$this->demo_data = get_transient( 'awb_library_demo' );
			return $this->demo_data;
		}

		$response = wp_remote_get( $this->get_demo_url() . '/wp-json/demo/full', [ 'timeout' => 60 ] );

		// Exit if error.
		if ( is_wp_error( $response ) ) {
			return;
		}

		// Get the body.
		$resources = json_decode( wp_remote_retrieve_body( $response ), true );

		if ( is_array( $resources ) && ! isset( $resources['tags'] ) ) {
			return;
		}

		set_transient( 'awb_library_demo', $resources, DAY_IN_SECONDS );

		return $resources;
	}

	/**
	 * Load website page.
	 *
	 * @access public
	 * @since 3.5
	 * @return void
	 */
	public function load_website_page() {

		check_ajax_referer( 'fusion_load_nonce', 'fusion_load_nonce' );

		if ( ! isset( $_POST['post_id'] ) && '' === $_POST['post_id'] ) {
			die( -1 );
		}

		if ( ! isset( $_POST['demo_name'] ) && '' === $_POST['demo_name'] ) {
			die( -1 );
		}

		if ( ! isset( $_POST['page_id'] ) && '' === $_POST['page_id'] ) {
			die( -1 );
		}

		$demo_name = sanitize_text_field( wp_unslash( $_POST['demo_name'] ) );
		$demo_name = str_replace( '_', '-', $demo_name );
		$post_id   = (int) $_POST['post_id'];
		$page_id   = (int) $_POST['page_id'];
		$data      = [
			'success' => true,
			'post_id' => $post_id,
		];

		$page_ep = $this->page_url . '/' . $demo_name . '/wp-json/wp/v2/pages/' . $page_id . '/';

		$response = wp_remote_get( $page_ep, [ 'timeout' => 60 ] );
		// Exit if error.
		if ( is_wp_error( $response ) ) {
			$data['success'] = false;
			echo wp_json_encode( $data );
			die();
		}

		// Get the body.
		$resources = json_decode( wp_remote_retrieve_body( $response ), true );

		// Set post_content.
		if ( isset( $resources['content'] ) && isset( $resources['content']['raw'] ) ) {
			$data['post_content'] = $resources['content']['raw'];
		} else {
			$data['success'] = false; // required to have post_content otherwise flag it as error.
		}

		// Set page template.
		if ( isset( $resources['template'] ) && ! empty( $resources['template'] ) ) {
			$data['page_template'] = $resources['template'];
		}

		// TODO: data meta.
		if ( isset( $resources['avada_media'] ) && is_array( $resources['avada_media'] ) ) {
			$data['avada_media'] = $resources['avada_media'];
		}

		$json_data = wp_json_encode( $data );

		die( $json_data ); // phpcs:ignore WordPress.Security.EscapeOutput
	}

	/**
	 * Template used for website layouts.
	 *
	 * @access public
	 * @since 3.5
	 * @return void
	 */
	public function library_template() {
		?>
		<script type="text/html" id="tmpl-fusion_website_tags">
			<# var total = _.size( data ); #>
			<h3 class="awb-sites-heading-primary"><?php esc_html_e( 'Import Websites Pages', 'fusion-builder' ); ?></h3>
			<div class="awb-sites-search-wrapper">
				<span class="fusiona-search"></span>
				<input type="text" id="awb_sites_search_demos" placeholder="<?php esc_html_e( 'Paste page URL', 'fusion-builder' ); ?>">
			</div>
			<h4 class="awb-sites-heading-secondary"><?php esc_html_e( 'Filter Websites', 'fusion-builder' ); ?></h4>
			<ul>
				<li data-slug="all" class="current"><?php esc_html_e( 'All', 'fusion-builder' ); ?> <span>{{ total }}</span></li>
				<# _.each( tags, function( tag, slug ) { #>
				<li data-slug="{{ slug }}">{{{ tag.name }}} <span>{{ tag.count }}</span></li>
				<# } );#>
			</ul>
		</script>

		<script type="text/html" id="tmpl-fusion_website_layout">
			<#
			var slugs       = '';
			if ( 'object' === typeof tags ) {
				_.each( tags, function( tag ) {
					slugs += tag + ' ';
				} );
				slugs.trim();
			}

			#>
			<li class="fusion-page-layout awb-demo-pages-layout" data-website_id="{{ slug }}" data-website_title="{{{ post_title }}}" data-slug="{{ slugs }}">
				<div class="preview lazy-load">
					<# if ( 'undefined' !== typeof thumbnail ) { #>
					<img src="data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27{{ thumbnail.width }}%27%20height%3D%27{{ thumbnail.height }}%27%20viewBox%3D%270%200%20{{ thumbnail.width }}%20{{ thumbnail.height }}%27%3E%3Crect%20width%3D%27{{ thumbnail.width }}%27%20height%3D%273{{ thumbnail.height }}%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E" alt="" width="{{ thumbnail.width }}" height="{{ thumbnail.height }}" data-src="{{ thumbnail.url }}" data-alt="{{ post_title }}"/>
					<# } #>
				</div>
				<div class="bar">
					<span class="fusion_module_title">{{ post_title }}</span>
				</div>
			</li>
		</script>

		<script type="text/html" id="tmpl-fusion_website_pages">
			<div class="awb-page-item demo-{{{ slug }}} hidden" data-website_id="{{ slug }}" data-website_title="{{{ post_title }}}">
				<div class="awb-page-wrap">
					<ul class="awb-website-pages">
						<#
						if ( 'undefined' !== typeof pages ) {
							_.each( pages, function( page, page_key ) {
								var site_link = page.link.replace( /^(https?):\/\//, '' );
						#>
								<li class="awb-demo-page-link" data-page-link="{{{ site_link }}}"><span>{{{ page.name }}}</span> <a href="{{{ page.link }}}" class="awb-sites-preview" target="_blank"><span class="fusiona-eye"></span> <?php esc_html_e( 'Preview', 'fusion-builder' ); ?></a> <a href="#" data-demo-name="{{{ slug }}}" data-page-name="{{ page_key }}" data-page-id="{{ page.ID }}" data-post-id="{{ <?php echo ( 'front' === $this->location ) ? '0' : 'fusionBuilderConfig.post_id'; ?> }}" class="button button-primary awb-sites-import-js"><?php esc_html_e( 'Import', 'fusion-builder' ); ?></a></li>
						<#
							} );
						} #>
					</ul>
					<# if ( 'undefined' !== typeof thumbnail ) { #>
					<img width="240" src="{{{ thumbnail.url }}}">
					<# } #>
				</div>
			</div>
		</script>

		<script type="text/template" id="fusion-builder-demo-import-modal">
			<div class="awb-admin-modal-wrap">
				<div class="awb-admin-modal-inner">

					<div class="awb-admin-modal-content">

						<h2 class="awb-studio-modal-title">
							<i class="fusiona-exclamation-sign"></i>
							<span><?php echo esc_html( __( 'Importing Prebuilt Page Content', 'fusion-builder' ) ); ?></span>
						</h2>

						<div class="awb-studio-modal-text">
							<?php echo esc_html( __( 'Your prebuilt page content is now being imported. This includes the layout, and any associated images and videos. The import process should only take a few seconds, depending on the amount of content to be imported.', 'fusion-builder' ) ); ?>
						</div>
					</div>

					<div class="awb-admin-modal-status-bar">
						<div class="awb-admin-modal-status-bar-label"><span></span></div>
						<div class="awb-admin-modal-status-bar-progress-bar"></div>

						<a class="button-done-demo demo-update-modal-close" href="#"><?php esc_html_e( 'Done' ); ?></a>
					</div>
				</div>

				<a href="#" class="awb-admin-modal-corner-close"><span class="dashicons dashicons-no-alt"></span></a>
			</div>

			<div class="awb-modal-overlay"></div>
		</script>
		<?php
	}
}

/**
 * Instantiates the AWB_Demo_Import class.
 * Make sure the class is properly set-up.
 *
 * @since object 3.0
 * @return object AWB_Demo_Import
 */
function AWB_Demo_Import() { // phpcs:ignore WordPress.NamingConventions
	return AWB_Demo_Import::get_instance();
}
AWB_Demo_Import();
