[Back]
import $ from 'jquery';

const { VPData, VPPopupAPI } = window;
const { __, settingsPopupGallery } = VPData;
const $doc = $(document);
const $window = $(window);

if (typeof $.fancybox !== 'undefined' && VPPopupAPI) {
	let fancyboxInstance;

	// Extend Popup API.
	VPPopupAPI.vendor = 'fancybox';
	VPPopupAPI.open = function (items, index, self) {
		const finalItems = [];

		// prepare items for fancybox api.
		items.forEach((item) => {
			if (item.type === 'embed' && item.src) {
				finalItems.push({
					type: 'iframe',
					src: item.src,
					opts: {
						width: item.width,
						height: item.height,
						caption: item.caption,
					},
				});
			} else if (item.type === 'embed' && item.embed) {
				finalItems.push({
					type: 'html',
					src: item.embed,
					opts: {
						width: item.width,
						height: item.height,
						caption: item.caption,
					},
				});
			} else {
				finalItems.push({
					type: 'image',
					src: item.src,
					el: item.el,
					opts: {
						width: item.width,
						height: item.height,
						srcset: item.srcset,
						caption: item.caption,
						thumb: item.srcSmall,
					},
				});
			}
		});

		const buttons = [];
		if (settingsPopupGallery.show_zoom_button) {
			buttons.push('zoom');
		}
		if (settingsPopupGallery.show_fullscreen_button) {
			buttons.push('fullScreen');
		}
		if (settingsPopupGallery.show_slideshow) {
			buttons.push('slideShow');
		}
		if (settingsPopupGallery.show_thumbs) {
			buttons.push('thumbs');
		}
		if (settingsPopupGallery.show_share_button) {
			buttons.push('share');
		}
		if (settingsPopupGallery.show_download_button) {
			buttons.push('download');
		}
		if (settingsPopupGallery.show_close_button) {
			buttons.push('close');
		}

		// define options
		const options = {
			// Close existing modals
			// Set this to false if you do not need to stack multiple instances
			closeExisting: true,

			// Enable infinite gallery navigation
			loop: true,

			// Should display navigation arrows at the screen edges
			arrows: settingsPopupGallery.show_arrows,

			// Should display counter at the top left corner
			infobar: settingsPopupGallery.show_counter,

			// Should display close button (using `btnTpl.smallBtn` template) over the content
			// Can be true, false, "auto"
			// If "auto" - will be automatically enabled for "html", "inline" or "ajax" items
			smallBtn: false,

			// Should display toolbar (buttons at the top)
			// Can be true, false, "auto"
			// If "auto" - will be automatically hidden if "smallBtn" is enabled
			toolbar: 'auto',

			// What buttons should appear in the top right corner.
			// Buttons will be created using templates from `btnTpl` option
			// and they will be placed into toolbar (class="fancybox-toolbar"` element)
			buttons,

			// Custom CSS class for layout
			baseClass: 'vp-fancybox',

			// Hide browser vertical scrollbars; use at your own risk
			hideScrollbar: true,

			// Use mousewheel to navigate gallery
			// If 'auto' - enabled for images only
			wheel: false,

			// Clicked on the content
			clickContent(current) {
				return current.type === 'image' &&
					settingsPopupGallery.click_to_zoom
					? 'zoom'
					: false;
			},

			lang: 'wordpress',
			i18n: {
				wordpress: {
					CLOSE: __.fancybox_close,
					NEXT: __.fancybox_next,
					PREV: __.fancybox_prev,
					ERROR: __.fancybox_error,
					PLAY_START: __.fancybox_play_start,
					PLAY_STOP: __.fancybox_play_stop,
					FULL_SCREEN: __.fancybox_full_screen,
					THUMBS: __.fancybox_thumbs,
					DOWNLOAD: __.fancybox_download,
					SHARE: __.fancybox_share,
					ZOOM: __.fancybox_zoom,
				},
			},

			beforeClose() {
				const currentItemData = items[fancyboxInstance.currIndex];

				if (currentItemData) {
					VPPopupAPI.maybeFocusGalleryItem(currentItemData);
				}

				if (self) {
					self.emitEvent('beforeCloseFancybox', [
						options,
						items,
						fancyboxInstance,
					]);
				}

				fancyboxInstance = false;
			},
			beforeShow(e, instance) {
				if (self) {
					self.emitEvent('beforeShowFancybox', [e, instance]);
				}
			},
			afterShow(e, instance) {
				if (self) {
					self.emitEvent('afterShowFancybox', [e, instance]);
				}
			},
		};

		if (self) {
			self.emitEvent('beforeInitFancybox', [options, finalItems, index]);
		}

		// Disable Loop if only 1 item in gallery.
		// We need this because Fancybox still let us scroll gallery using keyboard.
		if (items.length === 1) {
			options.loop = false;
		}

		// Start new fancybox instance
		fancyboxInstance = $.fancybox.open(finalItems, options, index);

		if (self) {
			self.emitEvent('initFancybox', [
				options,
				finalItems,
				index,
				fancyboxInstance,
			]);
		}
	};
	VPPopupAPI.close = function () {
		if (fancyboxInstance) {
			fancyboxInstance.close();
			fancyboxInstance = false;
		}
	};

	// Fix zoom image sizes attribute.
	// https://wordpress.org/support/topic/blurry-zoom-images/
	$doc.on('transitionend', '.fancybox-content', function () {
		const $img = $(this).find('.fancybox-image[sizes]');

		const sizes = `${Math.round(100 * ($img.width() / $window.width()))}vw`;

		$img.attr('sizes', sizes);
	});
}