<?php
/**
 * The Third Party integration with the NextGen Gallery plugin.
 *
 * @since		1.0.5
 */
namespace LiteSpeed\Thirdparty ;

defined( 'WPINC' ) || exit ;

// Try preload instead
// todo: need test
// add_action('load_nextgen_gallery_modules', 'NextGenGallery::detect') ;

class NextGenGallery
{
	const CACHETAG_ALBUMS = 'NGG_A.' ;
	const CACHETAG_GALLERIES = 'NGG_G.' ;
	const CACHETAG_TAGS = 'NGG_T.' ;

	/**
	 * Detect is triggered at the load_nextgen_gallery_modules action.
	 *
	 * If this action is triggered, assume NextGen Gallery is used.
	 *
	 * @since	1.0.5
	 * @access	public
	 */
	public static function preload()
	{
		add_action( 'ngg_added_new_image', __CLASS__ . '::add_image' ) ;
		add_action( 'ngg_ajax_image_save', __CLASS__ . '::update_image' ) ;
		add_action( 'ngg_delete_picture', __CLASS__ . '::delete_image' ) ;
		add_action( 'ngg_moved_images', __CLASS__ . '::move_image', 10, 3 ) ;
		add_action( 'ngg_copied_images', __CLASS__ . '::copy_image', 10, 3 ) ;
		add_action( 'ngg_generated_image', __CLASS__ . '::gen_image' ) ;
		add_action( 'ngg_recovered_image', __CLASS__ . '::gen_image' ) ;

		add_action( 'ngg_gallery_sort', __CLASS__ . '::update_gallery' ) ;
		add_action( 'ngg_delete_gallery', __CLASS__ . '::update_gallery' ) ;

		add_action( 'ngg_update_album', __CLASS__ . '::update_album' ) ;
		add_action( 'ngg_delete_album', __CLASS__ . '::update_album' ) ;

		add_filter( 'ngg_displayed_gallery_cache_params', __CLASS__ . '::add_container' ) ;
	}

	/**
	 * When an image is added, need to purge all pages that displays its gallery.
	 *
	 * @since	1.0.5
	 * @access	public
	 * @param	string	$image	The image object added.
	 */
	public static function add_image($image)
	{
		if ( ! $image || ! method_exists( $image, 'get_gallery' ) ) {
			return ;
		}
		$gallery = $image->get_gallery() ;
		if ( $gallery && $gallery->pageid ) {
			do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $gallery->pageid ) ;
		}
	}

	/**
	 * When an image is updated, need to purge all pages that displays its gallery.
	 *
	 * @since 1.0.5
	 * @access	public
	 */
	public static function update_image()
	{
		if ( isset( $_REQUEST[ 'gallery_id' ] ) ) {
			do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $_REQUEST[ 'gallery_id' ] ) ;
			return ;
		}

		if ( isset( $_POST[ 'task_list' ] ) ) {
			$task_list = str_replace( '\\', '', $_POST[ 'task_list' ] ) ;
			$task_list = json_decode( $task_list, true ) ;

			if ( ! empty( $task_list[ 0 ][ 'query' ][ 'id' ] ) ) {
				do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $task_list[ 0 ][ 'query' ][ 'id' ] ) ;
				return ;
			}
		}

		if ( isset($_POST['id']) ) {
			$id = $_POST['id'] ;
		}
		elseif ( isset($_POST['image']) ) {
			$id = $_POST['image'] ;
		}
		elseif ( isset($_GET['pid']) ) {
			$id = $_GET['pid'] ;
		}
		else {
			error_log('LiteSpeed_Cache hit ngg_ajax_image_save with no post image id.') ;
			return ;
		}
		$image = \C_Image_Mapper::get_instance()->find($id) ;
		if ( $image ) {
			do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $image->galleryid );
		}
	}

	/**
	 * When an image is deleted, need to purge all pages that displays its gallery.
	 *
	 * @since 1.0.5
	 * @access	public
	 */
	public static function delete_image()
	{
		if ( isset($_GET['gid']) ) {
			do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $_GET['gid'] );
		}
	}

	/**
	 * When an image is moved, need to purge all old galleries and the new gallery.
	 *
	 * @since 1.0.8
	 * @access	public
	 * @param array $images unused
	 * @param array $old_gallery_ids Source gallery ids for the images.
	 * @param integer $new_gallery_id Destination gallery id.
	 */
	public static function move_image($images, $old_gallery_ids, $new_gallery_id)
	{
		foreach ($old_gallery_ids as $gid) {
			do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $gid );
		}
		do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $new_gallery_id );
	}

	/**
	 * When an image is copied, need to purge the destination gallery.
	 *
	 * @param array $image_pid_map unused
	 * @param array $old_gallery_ids unused
	 * @param integer $new_gallery_id Destination gallery id.
	 */
	public static function copy_image($image_pid_map, $old_gallery_ids, $new_gallery_id)
	{
		do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $new_gallery_id );
	}

	/**
	 * When an image is re-generated, need to purge the gallery it belongs to.
	 * Also applies to recovered images.
	 *
	 * @param Image $image The re-generated image.
	 */
	public static function gen_image($image)
	{
		do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $image->galleryid );
	}

	/**
	 * When a gallery is updated, need to purge all pages that display the gallery.
	 *
	 * @since 1.0.5
	 * @access  public
	 * @param	integer		$gid	The gallery id of the gallery updated.
	 */
	public static function update_gallery($gid)
	{
		// New version input will be an object with gid value
		if ( is_object( $gid ) && ! empty( $gid->gid ) ) {
			$gid = $gid->gid ;
		}

		do_action( 'litespeed_purge', self::CACHETAG_GALLERIES . $gid );
	}

	/**
	 * When an album is updated, need to purge all pages that display the album.
	 *
	 * @since 1.0.5
	 * @access public
	 * @param	integer		$aid	The album id of the album updated.
	 */
	public static function update_album($aid)
	{
		do_action( 'litespeed_purge', self::CACHETAG_ALBUMS . $aid );
	}

	/**
	 * When rendering a page, if the page has a gallery, album or tag cloud,
	 * it needs to be tagged appropriately.
	 *
	 * @since 1.0.5
	 * @access public
	 * @param object $render_parms Parameters used to render the associated part of the page.
	 * @return mixed Null if passed in null, $render_parms otherwise.
	 */
	public static function add_container($render_parms)
	{
		// Check if null. If it is null, can't continue.
		if ( is_null($render_parms) ) {
			return null ;
		}
		$src = $render_parms[0]->source ;
		$container_ids = $render_parms[0]->container_ids ;
		// Can switch on first char if we end up with more sources.
		switch ($src) {
			case 'albums':
				$tag = self::CACHETAG_ALBUMS ;
				break ;
			case 'galleries':
				$tag = self::CACHETAG_GALLERIES ;
				break ;
			case 'tags':
				$tag = self::CACHETAG_TAGS ;
				break ;
			default:
				return $render_parms ;
		}

		foreach ($container_ids as $id) {
			do_action( 'litespeed_tag_add', $tag . $id );
		}

		return $render_parms ;
	}
}

