<?php

/**
 * Videos
 *
 * @link    https://plugins360.com
 * @since   1.0.0
 *
 * @package All_In_One_Video_Gallery
 */

// Exit if accessed directly
if ( ! defined( 'WPINC' ) ) {
	die;
}

/**
 * AIOVG_Admin_Videos class.
 *
 * @since 1.0.0
 */
class AIOVG_Admin_Videos {

	/**
	 * Add "All Videos" menu.
	 *
	 * @since 1.6.5
	 */
	public function admin_menu() {	
		add_submenu_page(
			'all-in-one-video-gallery',
			__( 'All-in-One Video Gallery - Videos', 'all-in-one-video-gallery' ),
			__( 'All Videos', 'all-in-one-video-gallery' ),
			'manage_aiovg_options',
			'edit.php?post_type=aiovg_videos'
		);
		
		add_submenu_page(
			'all-in-one-video-gallery',
			__( 'Add New Video', 'all-in-one-video-gallery' ),
			__( 'Add New Video', 'all-in-one-video-gallery' ),
			'manage_aiovg_options',
			'post-new.php?post_type=aiovg_videos'
		);
	}

	/**
	 * Move "All Videos" submenu under our plugin's main menu.
	 *
	 * @since  1.6.5
	 * @param  string $parent_file The parent file.
	 * @return string $parent_file The parent file.
	 */
	public function parent_file( $parent_file ) {	
		global $submenu_file, $current_screen;

		if ( 'aiovg_videos' == $current_screen->post_type ) {
			$submenu_file = 'edit.php?post_type=aiovg_videos';
			$parent_file  = 'all-in-one-video-gallery';
		}

		return $parent_file;
	}

	/**
	 * Register the custom post type "aiovg_videos".
	 *
	 * @since 1.0.0
	 */
	public function register_post_type() {			
		$featured_images_settings = aiovg_get_option( 'aiovg_featured_images_settings' );
		$permalink_settings = aiovg_get_option( 'aiovg_permalink_settings' );
		
		$labels = array(
			'name'                  => _x( 'Videos', 'Post Type General Name', 'all-in-one-video-gallery' ),
			'singular_name'         => _x( 'Video', 'Post Type Singular Name', 'all-in-one-video-gallery' ),
			'menu_name'             => __( 'Video Gallery', 'all-in-one-video-gallery' ),
			'name_admin_bar'        => __( 'Video', 'all-in-one-video-gallery' ),
			'archives'              => __( 'Video Archives', 'all-in-one-video-gallery' ),
			'attributes'            => __( 'Video Attributes', 'all-in-one-video-gallery' ),
			'parent_item_colon'     => __( 'Parent Video:', 'all-in-one-video-gallery' ),
			'all_items'             => __( 'All Videos', 'all-in-one-video-gallery' ),
			'add_new_item'          => __( 'Add New Video', 'all-in-one-video-gallery' ),
			'add_new'               => __( 'Add New', 'all-in-one-video-gallery' ),
			'new_item'              => __( 'New Video', 'all-in-one-video-gallery' ),
			'edit_item'             => __( 'Edit Video', 'all-in-one-video-gallery' ),
			'update_item'           => __( 'Update Video', 'all-in-one-video-gallery' ),
			'view_item'             => __( 'View Video', 'all-in-one-video-gallery' ),
			'view_items'            => __( 'View Videos', 'all-in-one-video-gallery' ),
			'search_items'          => __( 'Search Video', 'all-in-one-video-gallery' ),
			'not_found'             => __( 'No videos found', 'all-in-one-video-gallery' ),
			'not_found_in_trash'    => __( 'Not found in Trash', 'all-in-one-video-gallery' ),
			'featured_image'        => __( 'Featured Image', 'all-in-one-video-gallery' ),
			'set_featured_image'    => __( 'Set featured image', 'all-in-one-video-gallery' ),
			'remove_featured_image' => __( 'Remove featured image', 'all-in-one-video-gallery' ),
			'use_featured_image'    => __( 'Use as featured image', 'all-in-one-video-gallery' ),
			'insert_into_item'      => __( 'Insert into video', 'all-in-one-video-gallery' ),
			'uploaded_to_this_item' => __( 'Uploaded to this video', 'all-in-one-video-gallery' ),
			'items_list'            => __( 'Videos list', 'all-in-one-video-gallery' ),
			'items_list_navigation' => __( 'Videos list navigation', 'all-in-one-video-gallery' ),
			'filter_items_list'     => __( 'Filter videos list', 'all-in-one-video-gallery' ),
		);
		
		$supports = array( 'title', 'editor', 'author', 'excerpt', 'comments' );			

		$has_thumbnail = isset( $featured_images_settings['enabled'] ) ? (int) $featured_images_settings['enabled'] : 0;
		if ( $has_thumbnail == 1 ) {
			$supports[] = 'thumbnail';
		}
		
		$args = array(
			'label'                 => __( 'Video', 'all-in-one-video-gallery' ),
			'description'           => __( 'Video Description', 'all-in-one-video-gallery' ),
			'labels'                => $labels,
			'supports'              => $supports,
			'taxonomies'            => array(),
			'hierarchical'          => false,
			'public'                => true,
			'show_ui'               => true,
			'show_in_menu'          => false,
			'show_in_nav_menus'     => true,
			'show_in_admin_bar'     => true,
			'show_in_rest'          => true,
			'can_export'            => true,
			'has_archive'           => true,		
			'exclude_from_search'   => false,
			'publicly_queryable'    => true,
			'capability_type'       => 'aiovg_video',
			'map_meta_cap'          => true
		);

		if ( is_array( $permalink_settings ) ) {
			if ( ! empty( $permalink_settings['video'] ) ) {
				$args['rewrite'] = array(
					'slug'       => sanitize_title( $permalink_settings['video'] ),
					'with_front' => false
				);
			}

			if ( ! empty( $permalink_settings['video_archive_page'] ) ) {
				$page_id = (int) $permalink_settings['video_archive_page'];
				$post    = get_post( $page_id );

				if ( $post && 'publish' === $post->post_status ) {
					$permalink = get_permalink( $page_id );

					if ( $permalink ) {
						$site_url = trailingslashit( home_url() );

						$slug = str_replace( $site_url, '', $permalink );            
						$slug = trim( $slug, '/' );
						$slug = urldecode( $slug );

						$args['rewrite'] = array(
							'slug'       => $slug,
							'with_front' => false
						);

						$args['has_archive'] = false;
					}
				}
			}
		}
		
		register_post_type( 'aiovg_videos', $args );	
	}
	
	/**
	 * Adds custom meta fields in the "Publish" meta box.
	 *
	 * @since 1.0.0
	 */
	public function post_submitbox_misc_actions() {	
		global $post, $post_type;
		
		if ( 'aiovg_videos' == $post_type ) {
			$post_id  = $post->ID;
			$featured = get_post_meta( $post_id, 'featured', true );

			require_once AIOVG_PLUGIN_DIR . 'admin/partials/video-submitbox.php';
		}		
	}
	
	/**
	 * Register meta boxes.
	 *
	 * @since 1.0.0
	 */
	public function add_meta_boxes() {
		add_meta_box( 
			'aiovg-video-metabox', 
			__( 'Video', 'all-in-one-video-gallery' ), 
			array( $this, 'display_meta_box_video' ), 
			'aiovg_videos', 
			'normal', 
			'high' 
		);
	}

	/**
	 * Display "Video" meta box.
	 *
	 * @since 1.0.0
	 * @param WP_Post $post WordPress Post object.
	 */
	public function display_meta_box_video( $post ) {
		$post_meta = get_post_meta( $post->ID );
		$post_meta = apply_filters( 'aiovg_get_post_meta', $post_meta, $post->ID, '', false, 'aiovg_videos' );

		require_once AIOVG_PLUGIN_DIR . 'admin/partials/video-metabox.php';
	}
	
	/**
	 * Save meta data.
	 *
	 * @since  1.0.0
	 * @param  int     $post_id Post ID.
	 * @param  WP_Post $post    The post object.
	 * @return int     $post_id If the save was successful or not.
	 */
	public function save_meta_data( $post_id, $post ) {	
		if ( ! isset( $_POST['post_type'] ) ) {
        	return $post_id;
    	}
	
		// Check this is the "aiovg_videos" custom post type
    	if ( 'aiovg_videos' != $post->post_type ) {
        	return $post_id;
    	}
		
		// If this is an autosave, our form has not been submitted, so we don't want to do anything
		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        	return $post_id;
		}
		
		// Check the logged in user has permission to edit this post
    	if ( ! aiovg_current_user_can( 'edit_aiovg_video', $post_id ) ) {
        	return $post_id;
    	}
		
		// Check if "aiovg_video_submitbox_nonce" nonce is set
    	if ( isset( $_POST['aiovg_video_submitbox_nonce'] ) ) {		
			// Verify that the nonce is valid
    		if ( wp_verify_nonce( $_POST['aiovg_video_submitbox_nonce'], 'aiovg_save_video_submitbox' ) ) {			
				// OK to save meta data.
				$featured = isset( $_POST['featured'] ) ? 1 : 0;
    			update_post_meta( $post_id, 'featured', $featured );				
			}			
		} else {
			$featured = (int) get_post_meta( $post_id, 'featured', true );
			update_post_meta( $post_id, 'featured', $featured );
		}
		
		// Check if "aiovg_video_metabox_nonce" nonce is set
    	if ( isset( $_POST['aiovg_video_metabox_nonce'] ) ) {		
			// Verify that the nonce is valid
    		if ( wp_verify_nonce( $_POST['aiovg_video_metabox_nonce'], 'aiovg_save_video_metabox' ) ) {			
				// OK to save meta data		
				$featured_images_settings = aiovg_get_option( 'aiovg_featured_images_settings' );

				$private_base_url = aiovg_get_private_base_url();

				$type = isset( $_POST['type'] ) ? sanitize_text_field( $_POST['type'] ) : 'default';
				update_post_meta( $post_id, 'type', $type );
				
				delete_post_meta( $post_id, 'is_video_uploaded' );

				$mp4 = isset( $_POST['mp4'] ) ? trim( $_POST['mp4'] ) : '';

				if ( ! empty( $mp4 ) ) {
					// Check if the URL is a masked uploaded file
					if ( 0 === strpos( $mp4, $private_base_url ) ) {
						// Extract the encoded portion
						$encoded = substr( $mp4, strlen( $private_base_url ) );

						// Decode the masked URL
						$decoded = aiovg_base64_decode( $encoded );

						// Sanitize the real file URL
						$mp4 = aiovg_sanitize_url( $decoded );

						update_post_meta( $post_id, 'is_video_uploaded', 1 );
					} else {
						// Direct URL entered by the user
						$mp4 = aiovg_sanitize_url( $mp4 );						
					}
				}

				update_post_meta( $post_id, 'mp4', $mp4 );
				update_post_meta( $post_id, 'mp4_id', attachment_url_to_postid( $mp4 ) );

				$has_webm = isset( $_POST['has_webm'] ) ? 1 : 0;
				update_post_meta( $post_id, 'has_webm', $has_webm );
				
				$webm = isset( $_POST['webm'] ) ? aiovg_sanitize_url( $_POST['webm'] ) : '';
				update_post_meta( $post_id, 'webm', $webm );
				update_post_meta( $post_id, 'webm_id', attachment_url_to_postid( $webm ) );
				
				$has_ogv = isset( $_POST['has_ogv'] ) ? 1 : 0;
				update_post_meta( $post_id, 'has_ogv', $has_ogv );
				
				$ogv = isset( $_POST['ogv'] ) ? aiovg_sanitize_url( $_POST['ogv'] ) : '';
				update_post_meta( $post_id, 'ogv', $ogv );
				update_post_meta( $post_id, 'ogv_id', attachment_url_to_postid( $ogv ) );

				$quality_level = isset( $_POST['quality_level'] ) ? sanitize_text_field( $_POST['quality_level'] ) : '';
				update_post_meta( $post_id, 'quality_level', $quality_level );

				if ( ! empty( $_POST['sources'] ) && ! empty( $_POST['quality_levels'] ) ) {					
					$values = array();

					$quality_levels = array_map( 'sanitize_text_field', $_POST['quality_levels'] );
					$sources = array_map( 'aiovg_sanitize_url', $_POST['sources'] );

					foreach ( $sources as $index => $source ) {
						if ( ! empty( $source ) && ! empty( $quality_levels[ $index ] ) ) {
							$values[] = array(
								'src'     => $source,
								'src_id'  => attachment_url_to_postid( $source ),  
								'quality' => $quality_levels[ $index ]								
							);
						}
					}

					update_post_meta( $post_id, 'sources', $values );
				}

				$hls = isset( $_POST['hls'] ) ? aiovg_sanitize_url( $_POST['hls'] ) : '';
				update_post_meta( $post_id, 'hls', $hls );
				
				$dash = isset( $_POST['dash'] ) ? aiovg_sanitize_url( $_POST['dash'] ) : '';
				update_post_meta( $post_id, 'dash', $dash );
				
				$youtube = isset( $_POST['youtube'] ) ? aiovg_sanitize_url( aiovg_resolve_youtube_url( $_POST['youtube'] ) ) : '';
				update_post_meta( $post_id, 'youtube', $youtube );
				
				$vimeo = isset( $_POST['vimeo'] ) ? aiovg_sanitize_url( $_POST['vimeo'] ) : '';
				update_post_meta( $post_id, 'vimeo', $vimeo );
				
				$dailymotion = isset( $_POST['dailymotion'] ) ? aiovg_sanitize_url( $_POST['dailymotion'] ) : '';
				update_post_meta( $post_id, 'dailymotion', $dailymotion );

				$rumble = isset( $_POST['rumble'] ) ? aiovg_sanitize_url( $_POST['rumble'] ) : '';
				update_post_meta( $post_id, 'rumble', $rumble );
				
				$facebook = isset( $_POST['facebook'] ) ? aiovg_sanitize_url( $_POST['facebook'] ) : '';
				update_post_meta( $post_id, 'facebook', $facebook );
				
				$embedcode = isset( $_POST['embedcode'] ) ? trim( wp_unslash( $_POST['embedcode'] ) ) : '';
				
				if ( $embedcode && filter_var( $embedcode, FILTER_VALIDATE_URL ) ) {
					$parsed = wp_parse_url( $embedcode );

					// Allow only http / https URLs
					if ( isset( $parsed['scheme'] ) && in_array( $parsed['scheme'], array( 'http', 'https' ) ) ) {
						$embedcode = sprintf(
							'<iframe src="%s" width="560" height="315" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>',
							esc_url( $embedcode )
						);
					}
				}

				add_filter( 'wp_kses_allowed_html', 'aiovg_allow_iframe_script_tags' );
				$embedcode = ! empty( $embedcode ) ? wp_kses_post( $embedcode ) : '';
				update_post_meta( $post_id, 'embedcode', $embedcode );
				remove_filter( 'wp_kses_allowed_html', 'aiovg_allow_iframe_script_tags' );
				
				$duration = '';

				if ( ! empty( $_POST['duration'] ) ) {
					$duration = sanitize_text_field( $_POST['duration'] );
				} else {
					if ( 'vimeo' == $type && ! empty( $vimeo ) ) {
						$duration = aiovg_get_vimeo_video_duration( $vimeo );
					} elseif ( 'dailymotion' == $type && ! empty( $dailymotion ) ) {
						$duration = aiovg_get_dailymotion_video_duration( $dailymotion );
					} elseif ( 'rumble' == $type && ! empty( $rumble ) ) {
						$duration = aiovg_get_rumble_video_duration( $rumble );
					} elseif ( 'embedcode' == $type && ! empty( $embedcode ) ) {
						$duration = aiovg_get_embedcode_video_duration( $embedcode );
					}

					$duration = aiovg_convert_seconds_to_human_time( $duration );
				}

				update_post_meta( $post_id, 'duration', $duration );
				
				$views = isset( $_POST['views'] ) ? (int) $_POST['views'] : 0;
				update_post_meta( $post_id, 'views', $views );

				$likes = isset( $_POST['likes'] ) ? (int) $_POST['likes'] : 0;
				update_post_meta( $post_id, 'likes', $likes );

				$dislikes = isset( $_POST['dislikes'] ) ? (int) $_POST['dislikes'] : 0;
				update_post_meta( $post_id, 'dislikes', $dislikes );
				
				$download = isset( $_POST['download'] ) ? (int) $_POST['download'] : 0;
				update_post_meta( $post_id, 'download', $download );
	
				// Poster Image	
				delete_post_meta( $post_id, 'is_image_uploaded' );

				$image    = isset( $_POST['image'] ) ? trim( $_POST['image'] ) : '';
				$image_id = 0;

				if ( ! empty( $image ) ) {
					// Check if the URL is a masked uploaded file
					if ( 0 === strpos( $image, $private_base_url ) ) {
						// Extract the encoded portion
						$encoded = substr( $image, strlen( $private_base_url ) );

						// Decode the masked URL
						$decoded = aiovg_base64_decode( $encoded );

						// Sanitize the real file URL
						$image = aiovg_sanitize_url( $decoded );

						update_post_meta( $post_id, 'is_image_uploaded', 1 );
					} else {
						// Direct URL entered by the user
						$image = aiovg_sanitize_url( $image );
					}

					$image_id = attachment_url_to_postid( $image );
				} else {
					if ( 'youtube' == $type && ! empty( $youtube ) ) {
						$image = aiovg_get_youtube_image_url( $youtube );
					} elseif ( 'vimeo' == $type && ! empty( $vimeo ) ) {
						$image = aiovg_get_vimeo_image_url( $vimeo, true );
					} elseif ( 'dailymotion' == $type && ! empty( $dailymotion ) ) {
						$image = aiovg_get_dailymotion_image_url( $dailymotion, true );
					} elseif ( 'rumble' == $type && ! empty( $rumble ) ) {
						$image = aiovg_get_rumble_image_url( $rumble, true );
					} elseif ( 'embedcode' == $type && ! empty( $embedcode ) ) {
						$image = aiovg_get_embedcode_image_url( $embedcode, true );
					}
				}

				if ( ! empty( $featured_images_settings['enabled'] ) ) { // Set featured image
					$set_featured_image = isset( $_POST['set_featured_image'] ) ? (int) $_POST['set_featured_image'] : 0;
					update_post_meta( $post_id, 'set_featured_image', $set_featured_image );
					
					if ( empty( $image ) ) {
						$set_featured_image = 0;
					} else {
						if ( isset( $_POST['images'] ) ) { // Has images from thumbnail generator?
							$images = array_map( 'aiovg_sanitize_url', $_POST['images'] );
	
							foreach ( $images as $__image ) {		
								if ( $__image == $image ) {
									$set_featured_image = 0;
									break;
								}
							}
						}
					}					

					if ( ! empty( $set_featured_image ) ) {
						if ( empty( $image_id ) && ! empty( $featured_images_settings['download_external_images'] ) ) {
							$image_id = aiovg_create_attachment_from_external_image_url( $image, $post_id );
						}

						if ( ! empty( $image_id ) ) {
							set_post_thumbnail( $post_id, $image_id ); 
						}
					}
				}
				
				update_post_meta( $post_id, 'image', $image );
				update_post_meta( $post_id, 'image_id', $image_id );

				$image_alt = isset( $_POST['image_alt'] ) ? sanitize_text_field( $_POST['image_alt'] ) : '';
				update_post_meta( $post_id, 'image_alt', $image_alt );

				// Subtitles
				delete_post_meta( $post_id, 'track' );
				
				if ( ! empty( $_POST['track_src'] ) ) {				
					$sources = $_POST['track_src'];
					$sources = array_map( 'trim', $sources );	
					$sources = array_filter( $sources );
					
					foreach ( $sources as $key => $source ) {
						$track = array(
							'src'     => aiovg_sanitize_url( $source ),
							'src_id'  => attachment_url_to_postid( $source ),  
							'label'   => sanitize_text_field( $_POST['track_label'][ $key ] ),
							'srclang' => sanitize_text_field( $_POST['track_srclang'][ $key ] )
						);
						
						add_post_meta( $post_id, 'track', $track );
					}					
				}

				// Chapters
				delete_post_meta( $post_id, 'chapter' );
				
				if ( ! empty( $_POST['chapter_time'] ) ) {				
					foreach ( $_POST['chapter_time'] as $key => $value ) {						
						$time  = sanitize_text_field( $_POST['chapter_time'][ $key ] );
						$label = sanitize_text_field( $_POST['chapter_label'][ $key ] );

						if ( empty( $time ) || empty( $label ) ) continue;

						$chapter = array(
							'time'  => $time,
							'label' => $label
						);
						
						add_post_meta( $post_id, 'chapter', $chapter );
					}
				}

				// Email Capture: Check if "aiovg_video_email_capture_nonce" nonce is set
				if ( isset( $_POST['aiovg_video_email_capture_nonce'] ) ) {
					// Verify that the nonce is valid
					if ( wp_verify_nonce( $_POST['aiovg_video_email_capture_nonce'], 'aiovg_save_video_email_capture' ) ) {
						// OK to save meta data
						$email_capture = isset( $_POST['email_capture'] ) ? (int) $_POST['email_capture'] : -1;
						update_post_meta( $post_id, 'email_capture', $email_capture );
					}
				}
				
				// Restrictions: Check if "aiovg_video_restrictions_nonce" nonce is set
				if ( isset( $_POST['aiovg_video_restrictions_nonce'] ) ) {
					// Verify that the nonce is valid
					if ( wp_verify_nonce( $_POST['aiovg_video_restrictions_nonce'], 'aiovg_save_video_restrictions' ) ) {
						// OK to save meta data
						$access_control = isset( $_POST['access_control'] ) ? (int) $_POST['access_control'] : -1;
						update_post_meta( $post_id, 'access_control', $access_control );

						$restricted_roles = isset( $_POST['restricted_roles'] ) ? array_map( 'sanitize_text_field', $_POST['restricted_roles'] ) : array();
						update_post_meta( $post_id, 'restricted_roles', $restricted_roles );
					}
				}

				// Trailer: Check if "aiovg_video_trailer_nonce" nonce is set
				if ( isset( $_POST['aiovg_video_trailer_nonce'] ) ) {
					// Verify that the nonce is valid
					if ( wp_verify_nonce( $_POST['aiovg_video_trailer_nonce'], 'aiovg_save_video_trailer' ) ) {
						// OK to save meta data
						$trailer_type = isset( $_POST['trailer_type'] ) ? sanitize_text_field( $_POST['trailer_type'] ) : '';
						update_post_meta( $post_id, 'trailer_type', $trailer_type );

						if ( 'embedcode' === $trailer_type ) {
							$trailer_src = isset( $_POST['trailer_embedcode'] ) ? trim( wp_unslash( $_POST['trailer_embedcode'] ) ) : '';
							
							if ( $trailer_src && filter_var( $trailer_src, FILTER_VALIDATE_URL ) ) {
								$parsed = wp_parse_url( $trailer_src );

								// Allow only http / https URLs
								if ( isset( $parsed['scheme'] ) && in_array( $parsed['scheme'], array( 'http', 'https' ) ) ) {
									$trailer_src = sprintf(
										'<iframe src="%s" width="560" height="315" frameborder="0" scrolling="no" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>',
										esc_url( $trailer_src )
									);
								}
							}

							add_filter( 'wp_kses_allowed_html', 'aiovg_allow_iframe_script_tags' );
							$trailer_src = ! empty( $trailer_src ) ? wp_kses_post( $trailer_src ) : '';
							remove_filter( 'wp_kses_allowed_html', 'aiovg_allow_iframe_script_tags' );

							$trailer_src_id = 0;
						} else {
							$trailer_src = isset( $_POST['trailer_src'] ) ? aiovg_sanitize_url( $_POST['trailer_src'] ) : '';
							$trailer_src_id = attachment_url_to_postid( $trailer_src );
						}

						update_post_meta( $post_id, 'trailer_src', $trailer_src );
						update_post_meta( $post_id, 'trailer_src_id', $trailer_src_id );
					}
				}

			}
		}

		return $post_id;
	}
	
	/**
	 * Print footer scripts.
	 *
	 * @since 4.0.1
	 */
	public function print_footer_scripts() {
		if ( ! current_user_can( 'manage_aiovg_options' ) ) {
			return false;
		}

		global $pagenow, $typenow;
		if ( ! in_array( $pagenow, array( 'post-new.php', 'post.php' ) ) || 'aiovg_videos' != $typenow ) {
			return false;
		}

		// Export Emails button — edit screen only, when email capture is globally enabled
		if ( 'post.php' == $pagenow ) {
			$email_capture_settings = aiovg_get_option( 'aiovg_email_capture_settings' );

			if ( ! empty( $email_capture_settings['enable_email_capture'] ) ) {
				global $post;
				$post_id = isset( $post ) ? (int) $post->ID : 0;

				if ( $post_id > 0 ) {
					?>
					<script type="text/javascript">
						(function( $ ) {
							'use strict';

							$(function() {
								const button = '<a href="javascript: void(0);" class="page-title-action aiovg-export-email-leads" data-video-id="<?php echo (int) $post_id; ?>"><?php echo esc_js( __( 'Export Emails', 'all-in-one-video-gallery' ) ); ?></a>';
								$( button ).insertBefore( '.wp-header-end' );
							});
						})( jQuery );
					</script>
					<?php
				}
			}
		}

		if ( defined( 'AIOVG_DISABLE_TOUR' ) && AIOVG_DISABLE_TOUR ) {
			return false;
		}

		$current_user_id = get_current_user_id();
		$video_form_tour = get_user_meta( $current_user_id, 'aiovg_video_form_tour', true );
		$automatic_tour_enabled = 0;

		if ( 'completed' == $video_form_tour ) {
			return false;
		}		

		if ( '' == $video_form_tour ) {
			$automatic_tour_enabled = 1;

			$args = array(				
				'post_type' => 'aiovg_videos',			
				'posts_per_page' => 1,
				'fields' => 'ids',
				'no_found_rows' => true,
				'update_post_term_cache' => false,
				'update_post_meta_cache' => false
			);
			
			$aiovg_query = new WP_Query( $args );
			
			if ( $aiovg_query->have_posts() ) {
				$automatic_tour_enabled = 0;
			}
		}

		$l10n = array(
			'take_a_guided_tour' => __( 'Take a Guided Tour', 'all-in-one-video-gallery' ),
			'progress_text'      => sprintf( __( '%s of %s', 'all-in-one-video-gallery' ), '{{current}}', '{{total}}' ),
			'next_btn_text'      => __( 'Next →', 'all-in-one-video-gallery' ),
			'prev_btn_text'      => __( '← Previous', 'all-in-one-video-gallery' ),
			'done_btn_text'      => __( 'Done', 'all-in-one-video-gallery' ),
		);

		$steps = array(
			array(
				'popover' => array(
					'title'       => __( 'Welcome to the Quick Tour', 'all-in-one-video-gallery' ),
					'description' => __( 'This form lets you add or edit videos for your gallery.<br><br>Let\'s walk through the key steps to get your first video published.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '#title',
				'popover' => array(
					'title'       => __( 'Video Title', 'all-in-one-video-gallery' ),
					'description' => __( 'Start by entering a <strong>clear, descriptive title</strong> for your video.<br><br>This helps visitors (and search engines) understand what your video is about.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '#postdivrich',
				'popover' => array(
					'title'       => __( 'Video Description', 'all-in-one-video-gallery' ),
					'description' => __( 'Next, add a <strong>description</strong> for your video.<br><br>This is optional, but highly recommended, as it helps with <strong>SEO</strong>, provides context to your audience, and even shows up when sharing videos on social media.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '#aiovg-field-type',
				'popover' => array(
					'title'       => __( 'Source Type', 'all-in-one-video-gallery' ),
					'description' => __( 'Choose where your video is hosted — <strong>YouTube</strong>, <strong>Vimeo</strong>, <strong>Self-Hosted</strong>, or another source.<br><br>This helps the plugin know how to handle your video.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '%%video-field%%',
				'popover' => array(
					'title'       => __( 'Video File Input', 'all-in-one-video-gallery' ),
					'description' => __( 'Depending on the source you selected, either <strong>upload a video file</strong> or <strong>paste the video URL</strong>.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '#aiovg-field-image',
				'popover' => array(
					'title'       => __( 'Poster Image', 'all-in-one-video-gallery' ),
					'description' => sprintf(
						__( 'Upload a <strong>poster image</strong> for your video.<br><br>This image appears in the gallery and before the video plays.<br><br>Leave this field empty for <strong>YouTube, Vimeo, Dailymotion, and Rumble</strong> to automatically fetch thumbnails.<br><br>Want automatic thumbnails for <strong>self-hosted videos</strong>? Check out our <a href="%s" target="_blank" rel="noopener noreferrer">Premium Add-on</a>.', 'all-in-one-video-gallery' ),
						'https://plugins360.com/all-in-one-video-gallery/auto-thumbnail-generator/'
					)
				)
			),
			array(
				'element' => '#aiovg_categoriesdiv',
				'popover' => array(
					'title'       => __( 'Video Categories', 'all-in-one-video-gallery' ),
					'description' => __( 'Assign your video to <strong>categories</strong> to help visitors find related content.<br><br><strong>Need a new category?</strong> Just click "+ Add New Category" to create one.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '#tagsdiv-aiovg_tags',
				'popover' => array(
					'title'       => __( 'Video Tags', 'all-in-one-video-gallery' ),
					'description' => __( 'Add <strong>tags</strong> to describe your video in more detail.<br><br>Tags work like keywords and help visitors find similar videos.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '#publish',
				'popover' => array(
					'title'       => __( 'Save Your Video', 'all-in-one-video-gallery' ),
					'description' => __( 'All set? Great!<br><br>Click <strong>"Publish"</strong> to save your video.<br><br>Repeat these steps to add as many videos as you want.', 'all-in-one-video-gallery' )
				)
			),
			array(
				'element' => '#toplevel_page_all-in-one-video-gallery',
				'popover' => array(
					'title'       => __( 'Next Steps', 'all-in-one-video-gallery' ),
					'description' => sprintf(
						__( 'That\'s it — you\'re all set!<br><br>Use the menu on the left to manage your <strong>Videos</strong>, <strong>Categories</strong>, and <strong>Tags</strong>. You can also customize the plugin in <strong>Settings</strong>.<br><br><strong>To display your videos on a page:</strong><br>Simply add this shortcode to any page or post: <code>[aiovg_videos filters="all"]</code><br><br>Want to customize how your gallery looks? <a href="%s" target="_blank" rel="noopener noreferrer">Check out this guide</a> to explore all the display options.', 'all-in-one-video-gallery' ),
						'https://plugins360.com/all-in-one-video-gallery/displaying-video-gallery/'
					),
					'align'       => 'center'
				)
			)
		);						
		?>
		<script type="text/javascript">
			(function( $ ) {
				'use strict';

				function initTour() {
					const type = $( '#aiovg-video-type' ).val();

					const driver = window.driver.js.driver;

					let steps = <?php echo json_encode( $steps ); ?>;
					steps.forEach(step => {
						if ( step.element == '%%video-field%%' ) {							
							step.element = '.aiovg-type-' + type;
						}
					});

					const driverObj = driver({
						steps: steps,
						disableActiveInteraction: true,
						popoverClass: 'driverjs-theme',
						showProgress: true,
						progressText: "<?php echo esc_html( $l10n['progress_text'] ); ?>",
						nextBtnText: "<?php echo esc_html( $l10n['next_btn_text'] ); ?>",
						prevBtnText: "<?php echo esc_html( $l10n['prev_btn_text'] ); ?>",
						doneBtnText: "<?php echo esc_html( $l10n['done_btn_text'] ); ?>",												
						onDestroyStarted: () => {
							const data = {
								'action': 'aiovg_store_user_meta',
								'key': 'aiovg_video_form_tour',				
								'value': ( driverObj.isLastStep() ? 'completed' : driverObj.getActiveIndex() ),
								'security': aiovg_admin.ajax_nonce
							};

							$.post( ajaxurl, data, function( response ) {
								// Do Nothing
							});

							driverObj.destroy();
						}
					});

					driverObj.drive();
				}
				
				$(function() {
					// Insert the "Take a Guided Tour" button
					const button = '<button type="button" id="aiovg-button-tour" class="page-title-action">' + 
						'<span class="dashicons dashicons-controls-repeat"></span> ' +
						'<?php echo esc_html( $l10n['take_a_guided_tour'] ); ?>' + 
						'</button>';

					$( button ).insertBefore( '.wp-header-end' );

					// Init Driver
					$( '#aiovg-button-tour' ).on( 'click', function( event ) {
						event.preventDefault();
						initTour();
					});	
					
					const automaticTourEnabled = <?php echo (int) $automatic_tour_enabled; ?>;
					if ( automaticTourEnabled == 1 ) {
						initTour();
					}
				});
			})( jQuery );
		</script>
		<?php
	}

	/**
	 * Add custom filter options.
	 *
	 * @since 1.0.0
	 */
	public function restrict_manage_posts() {	
		global $typenow, $wp_query;
		
		if ( 'aiovg_videos' == $typenow ) {			
			// Restrict by category
        	wp_dropdown_categories(array(
            	'show_option_none'  => __( "All Categories", 'all-in-one-video-gallery' ),
				'option_none_value' => 0,
            	'taxonomy'          => 'aiovg_categories',
            	'name'              => 'aiovg_categories',
            	'orderby'           => 'name',
            	'selected'          => isset( $wp_query->query['aiovg_categories'] ) ? $wp_query->query['aiovg_categories'] : '',
            	'hierarchical'      => true,
            	'depth'             => 3,
            	'show_count'        => false,
            	'hide_empty'        => false,
        	));			
			
			// Restrict by custom filtering options	
			if ( current_user_can( 'manage_aiovg_options' ) ) {
				$selected = isset( $_GET['aiovg_filter'] ) ? sanitize_text_field( $_GET['aiovg_filter'] ) : '';

				$options  = array(
					''         => __( 'All Videos', 'all-in-one-video-gallery' ),
					'featured' => __( 'Featured Only', 'all-in-one-video-gallery' )
				);

				$options = apply_filters( 'aiovg_admin_videos_custom_filters', $options );

				echo '<select name="aiovg_filter">';
				foreach ( $options as $value => $label ) {
					printf( '<option value="%s"%s>%s</option>', $value, selected( $value, $selected, false ), $label );
				}
				echo '</select>';
			}
    	}	
	}
	
	/**
	 * Parse a query string and filter listings accordingly.
	 *
	 * @since 1.0.0
	 * @param WP_Query $query WordPress Query object.
	 */
	public function parse_query( $query ) {	
		global $pagenow, $post_type;
		
		if ( ! $query->is_main_query() ) {
			return;
		}
		
    	if ( 'edit.php' == $pagenow && 'aiovg_videos' == $post_type ) {		
			// Search by ID using "id:123" prefix
			if ( isset( $query->query_vars['s'] ) ) {
				$s = trim( $query->query_vars['s'] );
				if ( preg_match( '/^id:\s*(\d+)$/i', $s, $matches ) ) {
					$query->query_vars['p'] = (int) $matches[1];
					$query->query_vars['s'] = '';
				}
			}

			// Convert category id to taxonomy term in query
			if ( isset( $query->query_vars['aiovg_categories'] ) && ctype_digit( $query->query_vars['aiovg_categories'] ) && 0 != $query->query_vars['aiovg_categories'] ) {		
        		$term = get_term_by( 'id', $query->query_vars['aiovg_categories'], 'aiovg_categories' );
        		$query->query_vars['aiovg_categories'] = $term->slug;			
			}
			
			// Convert tag id to taxonomy term in query
			if ( isset( $query->query_vars['aiovg_tags'] ) && ctype_digit( $query->query_vars['aiovg_tags'] ) && 0 != $query->query_vars['aiovg_tags'] ) {		
        		$term = get_term_by( 'id', $query->query_vars['aiovg_tags'], 'aiovg_tags' );
        		$query->query_vars['aiovg_tags'] = $term->slug;			
    		}

			// Set featured meta in query
			$query->query_vars['meta_query'] = array(
				'relation' => 'AND'
			);

			if ( isset( $_GET['aiovg_filter'] ) && 'featured' == $_GET['aiovg_filter'] ) {		
        		$query->query_vars['meta_query']['featured'] = array(
					'key'   => 'featured',
					'value' => 1
				);			
    		}
			
			// Sort by views
			if ( isset( $_GET['orderby'] ) && 'views' == $_GET['orderby'] ) {
				$query->query_vars['meta_query']['views'] = array(
					'relation' => 'OR',
					array(
						'key'     => 'views',
						'compare' => 'NOT EXISTS'
					),
					array(
						'key'     => 'views',
						'compare' => 'EXISTS'
					)
				);

				$query->query_vars['orderby'] = 'views';
			}
		}	
	}

	/**
	 * Filters the array of row action links.
	 *
	 * @since  2.5.1
	 * @param  array   $actions An array of row action links.
	 * @param  WP_Post $post    The post object.
	 * @return array            Filtered array of row action links.
	 */
	public function row_actions( $actions, $post ) {
		if ( $post->post_type == 'aiovg_videos' ) {
			// Copy URL
			$copy_shortcode = sprintf(
				'<a class="aiovg-copy-url" href="javascript: void(0);" data-url="%s">%s</a>',
				get_permalink( $post->ID ),
				esc_html__( 'Copy URL', 'all-in-one-video-gallery' )
			);

			$actions['copy-url'] = $copy_shortcode;

			// Copy Shortcode
			$copy_shortcode = sprintf(
				'<a class="aiovg-copy-shortcode" href="javascript: void(0);" data-id="%d">%s</a>',
				$post->ID,
				esc_html__( 'Copy Shortcode', 'all-in-one-video-gallery' )
			);

			$actions['copy-shortcode'] = $copy_shortcode;

			// Export Emails
			if ( current_user_can( 'manage_aiovg_options' ) ) {
				$email_capture_settings = aiovg_get_option( 'aiovg_email_capture_settings' );

				if ( ! empty( $email_capture_settings['enable_email_capture'] ) ) {
					$actions['export-emails'] = sprintf(
						'<a class="aiovg-export-email-leads" href="javascript: void(0);" data-video-id="%d">%s</a>',
						$post->ID,
						esc_html__( 'Export Emails', 'all-in-one-video-gallery' )
					);
				}
			}
		}

		return $actions;
	}
	
	/**
	 * Retrieve the table columns.
	 *
	 * @since  1.0.0
	 * @param  array $columns Array of default table columns.
	 * @return array          Filtered columns array.
	 */
	public function get_columns( $columns ) {
		$columns = aiovg_insert_array_after( 'cb', $columns, array( 
			'image' => ''
		));

		$columns = aiovg_insert_array_after( 'taxonomy-aiovg_tags', $columns, array(
			'post_meta' => __( 'Metadata', 'all-in-one-video-gallery' ),
			'post_id'   => __( 'ID', 'all-in-one-video-gallery' )
		));

		$columns['taxonomy-aiovg_categories'] = __( 'Categories', 'all-in-one-video-gallery' );
		$columns['taxonomy-aiovg_tags'] = __( 'Tags', 'all-in-one-video-gallery' );
		
		return $columns;		
	}

	/**
	 * Retrieve the sortable table columns.
	 *
	 * @since  2.5.1
	 * @param  array $columns Array of default sortable columns.
	 * @return array          Filtered sortable columns array.
	 */
	public function sortable_columns( $columns ) {			
		$columns['post_id'] = 'post_id';
		return $columns;		
	}
	
	/**
	 * This function renders the custom columns in the list table.
	 *
	 * @since 1.0.0
	 * @param string $column  The name of the column.
	 * @param string $post_id Post ID.
	 */
	public function custom_column_content( $column, $post_id ) {	
		switch ( $column ) {
			case 'image':
				$image_data = aiovg_get_image( $post_id, 'thumbnail', 'post', true );

				printf(
					'<img src="%s" alt="" style="width: 75px;" />',
					$image_data['src']
				);
				break;
			case 'post_meta':
				$meta = array();

				// Views
				$views = (int) get_post_meta( $post_id, 'views', true );

				$meta[] = sprintf( 
					'<span class="aiovg-meta-label">%s:</span> <span class="aiovg-meta-value">%d</span>', 
					esc_html__( 'Views', 'all-in-one-video-gallery' ),
					$views
				);

				// Likes
				$likes = (int) get_post_meta( $post_id, 'likes', true );

				$meta[] = sprintf( 
					'<span class="aiovg-meta-label">%s:</span> <span class="aiovg-meta-value">%d</span>', 
					esc_html__( 'Likes', 'all-in-one-video-gallery' ),
					$likes
				);

				// Dislikes
				$dislikes = (int) get_post_meta( $post_id, 'dislikes', true );

				$meta[] = sprintf( 
					'<span class="aiovg-meta-label">%s:</span> <span class="aiovg-meta-value">%d</span>', 
					esc_html__( 'Dislikes', 'all-in-one-video-gallery' ),
					$dislikes
				);

				// Featured
				if ( current_user_can( 'manage_aiovg_options' ) ) {
					$value = get_post_meta( $post_id, 'featured', true );

					$meta[] = sprintf( 
						'<span class="aiovg-meta-label">%s:</span> <span class="aiovg-meta-value">%s</span>', 
						esc_html__( 'Featured', 'all-in-one-video-gallery' ),
						( 1 == $value ? '&#x2713;' : '&#x2717;' ) 
					);
				}
				
				echo '<ul class="aiovg-unstyled-list"><li>' . implode( '</li><li>', $meta ) . '</li></ul>';
				break;
			case 'post_id':
				echo $post_id;
				break;
		}		
	}
	
	/**
	 * Disable Gutenberg on our custom post type "aiovg_videos".
	 *
	 * @since  2.4.4
	 * @param  bool   $use_block_editor Default status.
	 * @param  string $post_type        The post type being checked.
	 * @return bool   $use_block_editor Filtered editor status.
	 */
	public function disable_gutenberg( $use_block_editor, $post_type ) {
		if ( 'aiovg_videos' === $post_type ) return false;
		return $use_block_editor;
	}
	
	/**
	 * Delete video attachments.
	 *
	 * @since 1.0.0
	 * @param int   $post_id Post ID.
	 */
	public function before_delete_post( $post_id ) {
		if ( 'aiovg_videos' != get_post_type( $post_id ) ) {
			return;
		}

		aiovg_delete_video_attachments( $post_id );
	}

}
