<?php
/**
 * Addional featured image for any post types
 *
 * @addon secondary-image
 * @version 1.2
 *
 * @package ThemeREX Addons
 * @since v1.84.0
 */


class TRX_Addons_Secondary_Image {

	/**
	 * The class arguments.
	 *
	 * @since 1.84.0
	 * @access private
	 * @var array
	 */
	private $args = array();

	/**
	 * Constructor.
	 *
	 * @since 1.84.0
	 * @access public
	 * @param array $args The arguments.
	 * @return void
	 */
	public function __construct( $args = array() ) {

		$this->args = wp_parse_args( $args, array(
			'store_as_url' => true,
			'post_type'    => 'post',
			'name'         => esc_attr__( 'Secondary Image', 'trx_addons' ),
			'label_set'    => esc_attr__( 'Set secondary image', 'trx_addons' ),
			'label_remove' => esc_attr__( 'Remove secondary image', 'trx_addons' ),
		) );
		$this->args['metabox_id']       = 'secondary_image';
		$this->args['post_meta_key']    = 'trx_addons_' . $this->args['metabox_id'];
		$this->args['nonce_action']     = $this->args['metabox_id'] . '_nonce_action';
		$this->args['nonce_name']       = $this->args['metabox_id'] . '_nonce_name';

		add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ) );
		add_action( 'save_post', array( $this, 'save_meta_box' ) );
	}

	/**
	 * Add metabox for a secondary image.
	 *
	 * @since 1.84.0
	 * @access public
	 * @return void
	 */
	public function add_meta_box() {
		add_meta_box(
			$this->args['metabox_id'],
			$this->args['name'],
			array( $this, 'show_meta_box' ),
			$this->args['post_type'],
			'side',
			'default'
		);
	}

	/**
	 * Output the metabox content.
	 *
	 * @since 1.84.0
	 * @access public
	 * @global object $post
	 * @return void
	 */
	public function show_meta_box() {
		global $post;

		$image_id  = get_post_meta( $post->ID, $this->args['post_meta_key'], true );
		if ( is_numeric( $image_id ) && (int) $image_id > 0 ) {
			$attachment = wp_get_attachment_image_src( $image_id, 'post-thumbnail' );
			$image_url = empty( $attachment[0] ) ? '' : $attachment[0];
		} else {
			$image_url = $image_id;
		}

		$output = '<div class="trx_addons-secondary-image-meta-box">'
						. wp_nonce_field( $this->args['nonce_action'], $this->args['nonce_name'], true, false )
						. '<input type="hidden"'
								. ' id="' . esc_attr( $this->args['post_meta_key'] ) . '_pt"'
								. ' name="' . esc_attr( $this->args['post_meta_key'] ) . '_pt"'
								. ' value="' . esc_attr( $this->args['post_type'] ) . '"'
								. '>'
						. '<input type="hidden"'
								. ' id="' . esc_attr( $this->args['post_meta_key'] ) . '"'
								. ' name="' . esc_attr( $this->args['post_meta_key'] ) . '"'
								. ' value="' . esc_attr( $image_url ) . '"'
								. '>'
						. trx_addons_options_show_custom_field( $this->args['post_meta_key'] . '_button',
								array(
									'type' => 'mediamanager',
									'multiple' => false,
									'data_type' => 'image',
									'button_caption' => '',
									'class_field' => '',
									'linked_field_id' => $this->args['post_meta_key']
									),
								$image_url
							)
					. '</div>';


		trx_addons_show_layout( $output );
	}

	/**
	 * Saves the metabox.
	 *
	 * @since 1.84
	 * @access public
	 * @param string|int $post_id The post ID.
	 * @return void.
	 */
	public function save_meta_box( $post_id ) {
		// check nonce
		if ( ! wp_verify_nonce( trx_addons_get_value_gp( $this->args['nonce_name'] ), $this->args['nonce_action'] ) ) {
			return;
		}
		// check autosave
		if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
			return $post_id;
		}
		// check permissions
		$capability = 'post';
		$post_type = trx_addons_get_value_gp( $this->args['post_meta_key'] . '_pt', trx_addons_get_value_gp( 'post_type' ) );
		if ( ! empty( $post_type ) ) {
			$post_types = get_post_types( array( 'name' => $post_type ), 'objects' );
			if (!empty($post_types) && is_array($post_types)) {
				foreach ($post_types  as $type) {
					$capability = $type->capability_type;
					break;
				}
			}
		}
		if ( ! current_user_can( "edit_{$capability}", $post_id ) ) {
			return $post_id;
		}
		// save post meta
		$image_url = sanitize_text_field( trx_addons_get_value_gp( $this->args['post_meta_key'] ) );
		$image_id  = empty( $this->args['store_as_url'] ) ? trx_addons_attachment_url_to_postid( $image_url ) : 0;
		update_post_meta( $post_id, $this->args['post_meta_key'], is_numeric( $image_id ) && (int) $image_id > 0 ? $image_id : $image_url );
	}

	/**
	 * Return the ID of the secondary image.
	 *
	 * @since 1.84.0
	 * @static
	 * @access public
	 * @param int    $post_id A custom post ID.
	 * @return int The secondary image ID.
	 */
	public static function get_secondary_image_id( $post_id = -1, $check_pt = true ) {
		$image_id = 0;
		if ( $post_id == -1 ) {
			$post_id = get_the_ID();
		}
		$checked = ! $check_pt;
		if ( ! $checked ) {
			$post_types = trx_addons_get_option('secondary_image_post_types');
			$post_type = get_post_type( $post_id );
			$checked = is_array($post_types) && ! empty( $post_types[ $post_type ] );
		}
		if ( $checked ) {
			$image_id = get_post_meta( $post_id, 'trx_addons_secondary_image', true );
			if ( ! empty( $image_id ) && (int) $image_id == 0 ) {
				$image_id = trx_addons_attachment_url_to_postid( trx_addons_clear_thumb_size( $image_id ) );
			}
		}
		return apply_filters( 'trx_addons_filter_secondary_image_id', $image_id );
	}

	/**
	 * Return the url of the secondary image.
	 *
	 * @since 1.84.0
	 * @static
	 * @access public
	 * @param string $post_type The post type of the post the featured image belongs to.
	 * @param int    $post_id A custom post ID.
	 * @return int The secondary image ID.
	 */
	public static function get_secondary_image_url( $thumb_size, $post_id = -1, $check_pt = true ) {
		$image_url = 0;
		if ( $post_id == -1 ) {
			$post_id = get_the_ID();
		}
		$checked = ! $check_pt;
		if ( ! $checked ) {
			$post_types = trx_addons_get_option('secondary_image_post_types');
			$post_type = get_post_type( $post_id );
			$checked = is_array($post_types) && ! empty( $post_types[ $post_type ] );
		}
		if ( $checked ) {
			$image_id = get_post_meta( $post_id, 'trx_addons_secondary_image', true );
			if ( is_numeric( $image_id ) && (int) $image_id > 0 ) {
				$attachment = wp_get_attachment_image_src( $image_id, $thumb_size );
				$image_url = empty( $attachment[0] ) ? '' : $attachment[0];
			} else {
				$image_url = trx_addons_add_thumb_size( $image_id, $thumb_size );
			}
		}
		return apply_filters( 'trx_addons_filter_secondary_image_url', $image_url );
	}
}


// Return the ID of the secondary image.
if ( ! function_exists( 'trx_addons_get_secondary_image_id' ) ) {
	function trx_addons_get_secondary_image_id( $post_id = -1 ) {
		return TRX_Addons_Secondary_Image::get_secondary_image_id( $post_id );
	}
}


// Return the url of the secondary image.
if ( ! function_exists( 'trx_addons_get_secondary_image_url' ) ) {
	function trx_addons_get_secondary_image_url( $thumb_size, $post_id = -1 ) {
		return TRX_Addons_Secondary_Image::get_secondary_image_url( $thumb_size, $post_id );
	}
}


// Add params to the ThemeREX Addons Options.
if ( ! function_exists( 'trx_addons_secondary_image_add_options' ) ) {
	add_filter( 'trx_addons_filter_options', 'trx_addons_secondary_image_add_options' );
	function trx_addons_secondary_image_add_options( $options ) {
		trx_addons_array_insert_before($options, 'sc_section', apply_filters( 'trx_addons_filter_options_secondary_image', array(
			'secondary_image_section' => array(
				"title" => esc_html__('Secondary image', 'trx_addons'),
				'icon' => 'trx_addons_icon-format-image',
				"type" => "section"
			),
			'secondary_image_section_info' => array(
				"title" => esc_html__('Secondary image settings', 'trx_addons') . trx_addons_get_theme_doc_link( '#themerex_addons_secondary_image' ),
				"desc" => wp_kses_data( __("Settings of the secondary images for any post type", 'trx_addons') ),
				"type" => "info"
			),
			"secondary_image_post_types" => array(
				"title" => esc_html__("Post types", 'trx_addons'),
				"desc" => wp_kses_data( __("Select post types to add secondary image (showed on hover in shortcodes and post type archives)", 'trx_addons') ),
				"dir" => 'horizontal',
				"std" => array( 'post' => 1 ),
				"options" => array(),
				"type" => "checklist"
			),					
		)));
		return $options;
	}
}

// Fill 'Post types' before show ThemeREX Addons Options
if ( ! function_exists('trx_addons_secondary_image_before_show_options')) {
	add_filter( 'trx_addons_filter_before_show_options', 'trx_addons_secondary_image_before_show_options', 10, 2);
	function trx_addons_secondary_image_before_show_options($options, $pt='') {
		if ( isset($options['secondary_image_post_types']) ) {
			$options['secondary_image_post_types']['options'] = trx_addons_get_list_posts_types();
		}
		return $options;
	}
}


// Init secondary image for selected post types
if ( ! function_exists( 'trx_addons_secondary_image_init_post_types' ) ) {
	add_filter( 'init', 'trx_addons_secondary_image_init_post_types' );
	function trx_addons_secondary_image_init_post_types() {
		$post_types = trx_addons_get_option('secondary_image_post_types');
		if ( is_array($post_types) ) {
			foreach( $post_types as $pt => $v ) {
				if ( empty($v) ) continue;
				new TRX_Addons_Secondary_Image( array(
					'post_type' => $pt
				) );
			}
		}
	}
}


// Load required styles and scripts for the frontend
if ( ! function_exists( 'trx_addons_secondary_image_load_scripts_front' ) ) {
	add_action("wp_enqueue_scripts", 'trx_addons_secondary_image_load_scripts_front', TRX_ADDONS_ENQUEUE_SCRIPTS_PRIORITY);
	function trx_addons_secondary_image_load_scripts_front() {
		if ( trx_addons_is_on( trx_addons_get_option('debug_mode') ) ) {
			wp_enqueue_style( 'trx_addons-secondary-image', trx_addons_get_file_url( TRX_ADDONS_PLUGIN_ADDONS . "secondary-image/secondary-image.css" ), array(), null );
		}
	}
}

	
// Merge styles to the single stylesheet
if ( ! function_exists( 'trx_addons_secondary_image_merge_styles' ) ) {
	add_filter("trx_addons_filter_merge_styles", 'trx_addons_secondary_image_merge_styles');
	function trx_addons_secondary_image_merge_styles($list) {
		$list[ TRX_ADDONS_PLUGIN_ADDONS . "secondary-image/secondary-image.css" ] = true;
		return $list;
	}
}


// Return secondary image layout
if ( ! function_exists( 'trx_addons_secondary_image_get_layout' ) ) {
	function trx_addons_secondary_image_get_layout() {
		$output = '';
		$image_url = trx_addons_get_secondary_image_url(
							apply_filters('trx_addons_filter_thumb_size', trx_addons_is_single() ? 'full' : trx_addons_get_thumb_size( 'masonry-big' ), 'secondary-image')
							);
		if ( ! empty( $image_url ) ) {
			$output = '<div class="trx_addons_secondary_image ' . trx_addons_add_inline_css_class( 'background-image:url(' . esc_url( $image_url ) . ');' ) . '"></div>';
		}
		return $output;
	}
}

// Start capture the featured image output
if ( ! function_exists( 'trx_addons_secondary_image_start_capture_featured_image_output' ) ) {
	add_filter( 'trx_addons_filter_featured_image', 'trx_addons_secondary_image_start_capture_featured_image_output', 1, 2 );
	function trx_addons_secondary_image_start_capture_featured_image_output( $done, $args=array() ) {
		$post_types = trx_addons_get_option('secondary_image_post_types');
		$post_type = get_post_type();
		if ( is_array($post_types) && ! empty( $post_types[ $post_type ] ) ) {
			ob_start();
		}
		return $done;
	}
}

// Add secondary image to the featured image output
if ( ! function_exists( 'trx_addons_secondary_image_add_to_featured_image_output' ) ) {
	add_filter( 'trx_addons_filter_featured_image', 'trx_addons_secondary_image_add_to_featured_image_output', 1000, 2 );
	function trx_addons_secondary_image_add_to_featured_image_output( $done, $args=array() ) {
		$post_types = trx_addons_get_option('secondary_image_post_types');
		$post_type = get_post_type();
		if ( is_array($post_types) && ! empty( $post_types[ $post_type ] ) ) {
			$output = ob_get_contents();
			ob_end_clean();
			if ( ! empty( $output ) ) {
				if ( strpos( $output, 'post_featured') !== false && strpos( $output, 'trx_addons_secondary_image') === false ) {
					$html = trx_addons_secondary_image_get_layout();
					if ( ! empty( $html ) ) {
						$output = preg_replace(
												'/(<div[\s]*class="[^"]*post_featured)([^>]*>)/',
												'$1 with_secondary_image $2' . $html,
												$output
												);
					}
				}
				trx_addons_show_layout( $output );
			}
		}
		return $done;
	}
}


// Add secondary image to the featured image output
if ( ! function_exists( 'trx_addons_secondary_image_add_to_featured_image_internal' ) ) {
	add_action( 'trx_addons_action_before_featured', 'trx_addons_secondary_image_add_to_featured_image_internal' );
	function trx_addons_secondary_image_add_to_featured_image_internal() {
		$output = trx_addons_secondary_image_get_layout();
		if ( ! empty( $output ) ) {
			echo wp_kses( trx_addons_secondary_image_get_layout(), 'trx_addons_kses_content' );
		}
	}
}
