<?php
/**
 * Woodmart 360 product view module.
 *
 * @package woodmart
 */

if ( ! defined( 'WOODMART_THEME_DIR' ) ) {
	exit( 'No direct script access allowed' );
}

if ( ! function_exists( 'woodmart_360_metabox_output' ) ) {
	/**
	 * Output the HTML for the 360 product view images metabox.
	 *
	 * @param object $post The post object.
	 * @return void
	 */
	function woodmart_360_metabox_output( $post ) {
		?>
		<div id="product_360_images_container">
			<ul class="product_360_images">
				<?php

				if ( metadata_exists( 'post', $post->ID, '_product_360_image_gallery' ) ) {
					$product_image_gallery = get_post_meta( $post->ID, '_product_360_image_gallery', true );
				} else {
					// Backwards compat
					$attachment_ids        = get_posts( 'post_parent=' . $post->ID . '&numberposts=-1&post_type=attachment&orderby=menu_order&order=ASC&post_mime_type=image&fields=ids&meta_key=_woocommerce_360_image&meta_value=1' ); // phpcs:ignore WordPress.DB.SlowDBQuery
					$attachment_ids        = array_diff( $attachment_ids, array( get_post_thumbnail_id() ) );
					$product_image_gallery = implode( ',', $attachment_ids );
				}

				$attachments         = array_filter( explode( ',', $product_image_gallery ) );
				$update_meta         = false;
				$updated_gallery_ids = array();

				if ( ! empty( $attachments ) ) {
					foreach ( $attachments as $attachment_id ) {
						$attachment = wp_get_attachment_image( $attachment_id, 'thumbnail' );

						// if attachment is empty skip
						if ( empty( $attachment ) ) {
							$update_meta = true;
							continue;
						}

						echo '<li class="image" data-attachment_id="' . esc_attr( $attachment_id ) . '">
							' . wp_kses( $attachment, true ) . '
							<ul class="actions">
								<li><a href="#" rel="nofollow" class="delete tips" data-tip="' . esc_html__( 'Delete image', 'woodmart' ) . '">' . esc_html__( 'Delete', 'woodmart' ) . '</a></li>
							</ul>
						</li>';

						// rebuild ids to be saved
						$updated_gallery_ids[] = $attachment_id;
					}

					// need to update product meta to set new gallery ids
					if ( $update_meta ) {
						update_post_meta( $post->ID, '_product_360_image_gallery', implode( ',', $updated_gallery_ids ) );
					}
				}
				?>
			</ul>

			<input type="hidden" id="product_360_image_gallery" name="product_360_image_gallery" value="<?php echo esc_attr( $product_image_gallery ); ?>" />

		</div>
		<p class="add_product_360_images hide-if-no-js">
			<a href="#" rel="nofollow" data-choose="<?php esc_attr_e( 'Add Images to Product 360 view Gallery', 'woodmart' ); ?>" data-update="<?php esc_attr_e( 'Add to gallery', 'woodmart' ); ?>" data-delete="<?php esc_attr_e( 'Delete image', 'woodmart' ); ?>" data-text="<?php esc_attr_e( 'Delete', 'woodmart' ); ?>"><?php esc_html_e( 'Add product 360 view gallery images', 'woodmart' ); ?></a>
		</p>
		<?php
	}
}

if ( ! function_exists( 'woodmart_proccess_360_view_metabox' ) ) {
	/**
	 * Process the saving of the 360 product view images metabox.
	 *
	 * @param int $post_id The ID of the post being saved.
	 *
	 * @return void
	 */
	function woodmart_proccess_360_view_metabox( $post_id ) {
		$attachment_ids = isset( $_POST['product_360_image_gallery'] ) ? array_filter( explode( ',', wc_clean( $_POST['product_360_image_gallery'] ) ) ) : array(); // phpcs:ignore WordPress.Security

		if ( $attachment_ids ) {
			update_post_meta( $post_id, '_product_360_image_gallery', implode( ',', $attachment_ids ) );
		} else {
			delete_post_meta( $post_id, '_product_360_image_gallery' );
		}
	}

	add_action( 'woocommerce_process_product_meta', 'woodmart_proccess_360_view_metabox', 50 );
}

if ( ! function_exists( 'woodmart_get_360_gallery_attachment_ids' ) ) {
	/**
	 * Get the attachment IDs for the 360 product view gallery.
	 *
	 * @return mixed|void|null
	 */
	function woodmart_get_360_gallery_attachment_ids() {
		global $post;

		if ( ! $post ) {
			return;
		}

		$product_image_gallery = get_post_meta( $post->ID, '_product_360_image_gallery', true );

		return apply_filters( 'woocommerce_product_360_gallery_attachment_ids', array_filter( array_filter( (array) explode( ',', $product_image_gallery ) ), 'wp_attachment_is_image' ) );
	}
}

if ( ! function_exists( 'woodmart_product_360_view' ) ) {
	/**
	 * Output the HTML for the 360 product view on the single product page.
	 *
	 * @return void
	 */
	function woodmart_product_360_view() {
		$images = woodmart_get_360_gallery_attachment_ids();

		if ( empty( $images ) ) {
			return;
		}

		$id = wp_rand( 100, 999 );

		woodmart_enqueue_js_library( 'threesixty' );
		woodmart_enqueue_js_library( 'magnific' );
		woodmart_enqueue_js_script( 'product-360-button' );

		woodmart_enqueue_inline_style( 'mfp-popup' );
		woodmart_enqueue_inline_style( '360degree' );
		woodmart_enqueue_inline_style( 'mod-animations-transform' );
		woodmart_enqueue_inline_style( 'mod-transform' );

		if ( count( $images ) < 1 ) {
			return;
		}

		$image_data = wp_get_attachment_image_src( $images[0], 'full' );

		$args = array(
			'frames_count' => count( $images ),
			'images'       => array(),
			'width'        => $image_data[1],
			'height'       => $image_data[2],
		);

		foreach ( $images as $image ) {
			$args['images'][] = wp_get_attachment_image_url( $image, 'full' );
		}

		?>
			<div class="product-360-button wd-action-btn wd-gallery-btn wd-style-icon-bg-text">
				<a href="#product-360-view" rel="nofollow">
					<span class="wd-action-icon"></span>
					<span class="wd-action-text">
						<?php esc_html_e( '360 product view', 'woodmart' ); ?>
					</span>
				</a>
			</div>
			<div id="product-360-view" class="mfp-hide wd-popup wd-product-360-view wd-scroll-content">
				<div class="wd-threed-view wd-product-threed threed-id-<?php echo esc_attr( $id ); ?>" data-args='<?php echo wp_json_encode( $args ); ?>'>
					<ul class="threed-view-images"></ul>
					<div class="spinner">
						<span>0%</span>
					</div>
				</div>
			</div>
		<?php
	}
}
