/**
 * WooCommerce Cart Share & Save main object.
 *
 * @since 1.8.3
 */
const wcss = {
	admin_url  : wcssObj.ajax_url,
	loader     :'<div class="wcss-spinner">' +
					'<div class="wcss-dot1"></div>' +
					'<div class="wcss-dot2"></div>' +
				'</div>',

	show_loader: function() {
		jQuery( '.wcss-popup-ajax' ).html( this.loader );
	},

	open: function( action = '' ) {
		jQuery( '.wcss-popup-ajax' ).html( this.loader );
		jQuery( '.wcss-popup, .wcss-popup-overlay' ).show();
		jQuery( '.wcss-popup' ).attr( 'data-wcss-popup-status', '1' );

		if ( 'save_cart' === action ) {
			this.load_view( 'wcss_share_medium_ajax', function() {
				jQuery( '.wcss-share-medium' ).hide();
				jQuery( '.wcss-save-cart-form, .wcss-login-now' ).show();
			} );
		} else if ( 'email_cart' === action ) {
			this.load_view( 'wcss_share_medium_ajax', function() {
				jQuery( '.wcss-share-medium' ).hide();
				jQuery( '.wcss-email-cart' ).show();
			} );
		} else if ( 'print_cart' === action ) {
			this.load_view( 'wcss_share_medium_ajax', function() {
				jQuery( '[data-wcss-print-cart]' ).trigger( 'click' );
			} );
		} else if ( 'share_cart' === action ) {
			this.load_view( 'wcss_share_medium_ajax' );
		}

		/**
		 * Popup open trigger
		 *
		 * @since 1.8.3
		 */
		jQuery( document.body ).trigger( 'wcss_popup_open' );
	},

	close: function() {
		jQuery( '.wcss-popup-ajax' ).html( this.loader );
		jQuery( '.wcss-popup' ).attr( 'data-wcss-popup-status', '0' );
		jQuery( '.wcss-popup, .wcss-popup-overlay' ).hide();

		/**
		 * Popup close trigger
		 *
		 * @since 1.8.3
		 */
		jQuery( document.body ).trigger( 'wcss_popup_close' );
	},

	trigger: function() {
		if ( '1' == jQuery( '.wcss-popup' ).attr( 'data-wcss-popup-status' ) ) {
			this.close();
		} else {
			this.open( 'share_cart' );
		}
	},

	open_share_media_popup() {
		/**
		 * Share media channels popup open trigger
		 *
		 * @since 1.8.3
		 */
		jQuery( document.body ).trigger( 'wcss_share_media_popup_open' );

		this.open( 'share_cart' );
	},

	open_save_cart_popup() {
		/**
		 * Save cart popup open trigger
		 *
		 * @since 1.8.3
		 */
		jQuery( document.body ).trigger( 'wcss_save_cart_popup_open' );

		this.open( 'save_cart' );
	},

	open_email_cart_popup() {
		/**
		 * Save cart popup open trigger
		 *
		 * @since 1.8.3
		 */
		jQuery( document.body ).trigger( 'wcss_email_cart_popup_open' );

		this.open( 'email_cart' );
	},

	print_cart() {
		/**
		 * Print cart popup open trigger.
		 *
		 * @since 2.0.1
		 */
		jQuery( document.body ).trigger( 'wcss_print_cart_popup_open' );

		this.open( 'print_cart' );
	},

	open_saved_cart_popup( cart_key ) {
		if ( ! cart_key ) {
			console.error( "open_saved_cart_popup required cart_key." );
			return;
		}

		this.open();

		jQuery.ajax( {
			url: this.admin_url,
			type: 'POST',
			data: {
				'action': 'wcss_share_saved_cart_ajax',
				'cart_key': cart_key,
			},
		} )
		.done( function( response ) {
			jQuery( '.wcss-popup-ajax' ).html( response );
		} );

		/**
		 * Saved cart popup open trigger
		 *
		 * @since 1.8.3
		 */
		jQuery( document.body ).trigger( 'wcss_save_cart_popup_open' );
	},

	load_view: function( action, callback = '' ) {
		jQuery.ajax( {
			url: this.admin_url,
			type: 'GET',
			data: {
				'action': action,
			},
		} )
		.done( function( response ) {
			jQuery( '.wcss-popup-ajax' ).html( response );

			if ( typeof callback == 'function' ) {
				callback();
			}
		} );
	}

};

/**
 * WCSS operations.
 */
;( function( $ ) {
	"use strict";

	/**
	 * Shaker animation.
	 */
	function shaker( selector ) {
		$( selector ).addClass( 'wcss-shake-animation' );

		setTimeout( function() {
			$( selector ).removeClass( 'wcss-shake-animation' );
		}, 300 );
	}

	/**
	 * Open popup.
	 */
	$( document ).on( 'click', '[data-wcss-popup-open]', function( event ) {
		event.preventDefault();

		wcss.open_share_media_popup();
	} );

	/**
	 * Close popup.
	 */
	$( document ).on( 'click', '[data-wcss-popup-close]', function( event ) {
		event.preventDefault();

		wcss.close();
	} );

	/**
	 * Open save cart popup.
	 */
	$( document ).on( 'click', '[data-wcss-save-cart-btn]', function( e ) {
		e.preventDefault();

		wcss.open_save_cart_popup();
	} );

	/**
	 * Open email cart popup.
	 */
	$( document ).on( 'click', '[data-wcss-email-cart-btn]', function( e ) {
		e.preventDefault();

		wcss.open_email_cart_popup();
	} );

	/**
	 * Open print cart popup.
	 */
	 $( document ).on( 'click', '[data-wcss-print-cart-btn]', function( e ) {
		e.preventDefault();

		wcss.print_cart();
	} );

	/**
	 * Share saved cart - my account page.
	 */
	$( document ).on( 'click', '[data-wcss-share-saved-cart]', function( event ) {
		event.preventDefault();

		var cartKey = $( this ).attr( 'data-wcss-share-saved-cart' );

		wcss.open_saved_cart_popup( cartKey );
	} );

	// login now
	$( document ).on( 'click', '[data-wcss-save-cart]', function( event ) {
		event.preventDefault();

		$( '.wcss-share-medium' ).hide();
		$( '.wcss-save-cart-form, .wcss-login-now' ).show();
	} );


	// Disable share cart button if quantity updates
	$( document ).on( 'change', '.qty', function(event) {
		$( '[data-wcss-popup-open]' ).attr( 'disabled', 'disabled');
		$( '[data-wcss-save-cart-btn]' ).attr( 'disabled', 'disabled');
		$( '[data-wcss-email-cart-btn]' ).attr( 'disabled', 'disabled');
		$( '[data-wcss-print-cart-btn]' ).attr( 'disabled', 'disabled');
	} );

	// Enable share cart buttons if quantity updates
	$( document.body ).on( 'updated_cart_totals', function() {
		$( '[data-wcss-popup-open]' ).removeAttr( 'disabled' );
		$( '[data-wcss-save-cart-btn]' ).removeAttr( 'disabled' );
		$( '[data-wcss-email-cart-btn]' ).removeAttr( 'disabled' );
		$( '[data-wcss-print-cart-btn]' ).removeAttr( 'disabled' );
	} );

	/**
	 * Copy To Clipboard
	 */
	new ClipboardJS( '[data-wcss-copy-link]' );

	$( document ).on( 'click', '[data-wcss-copy-link]', function( e ) {
		e.preventDefault();

		var cart_link = $( this ).data( 'clipboard-text' );

		/**
		 * Copy link trigger.
		 *
		 * @since 1.8.3
		 */
		$( document.body ).trigger( 'wcss_copy_link', { cart_link : cart_link } );

		$( '.wcss-popup-ajax' ).html( '<div class="wcss-copied-to-clipboard">' + wcssObj.icons.check + '</div>' );
	} );


	/**
	 * Print cart
	 */
	$( document ).on( 'click', '[data-wcss-print-cart]', function( event ) {
		event.preventDefault();

		var cart_key  = $( this ).attr( 'data-wcss-print-cart' );
		var siteTitle = $( 'title' ).html();

		wcss.show_loader();

		$( '#wcss-print-cart' ).remove();
		$( 'title' ).html( wcssObj.print_cart_args.file_name );

		/**
		 * Before print cart key trigger.
		 *
		 * @since 1.8.3
		 */
		$( document.body ).trigger( 'wcss_before_print_cart', { cart_key : cart_key } );

		$.ajax( {
			url: wcssObj.wc_ajax_url.toString().replace( '%%endpoint%%', 'wcss_print_cart_ajax' ),
			type: 'POST',
			data: {
				'print_cart_key': cart_key,
			},
			success: function( response ) {
				$( 'body' ).append( '<div id="wcss-print-cart">' + response + '</div>' );

				$( '#wcss-print-cart' ).printThis( wcssObj.print_cart_args );

				setTimeout( function() {

					/**
					 * After print cart key trigger.
					 *
					 * @since 1.8.3
					 */
					$( document.body ).trigger( 'wcss_after_print_cart', { cart_key : cart_key } );

					wcss.close();
				}, 1000 );

				setTimeout( function() {
					$( 'title' ).html( siteTitle );
				}, 2000 );
			}
		} );
	} );

	/**
	 * Show email cart view form
	 */
	 $( document ).on( 'click', '[data-wcss-email]', function( e ) {
		e.preventDefault();

		$( '.wcss-share-medium' ).hide();
		$( '.wcss-email-cart' ).show();
	} );

	// Email cart send ajax call
	$( document ).on( 'submit', '#wcss-email-cart-form', function( e )  {
		e.preventDefault();

		var form   = $( this );
		var fields = form.find( ':input' );
		var error  = false;

		$( fields ).each( function() {
			var field = $( this ).attr( 'required' );

			// For some browsers, `attr` is undefined; for others, `attr` is false. Check for both.
			if ( typeof field !== typeof undefined && field !== false ) {
				if ( '' == $( this ).val() ) {
					shaker( $( this ) );
					error = true;
					return false;
				}
			}
		} );

		// if any error.
		if ( error === true ) {
			return;
		}

		// display loader
		wcss.show_loader();

		$.ajax( {
			url: wcssObj.wc_ajax_url.toString().replace( '%%endpoint%%', 'wcss_send_email_cart' ),
			type: 'POST',
			dataType: 'json',
			data: form.serialize(),
			success: function( response ) {
				if ( response.status == true ) {
					$( '.wcss-popup-ajax' ).html( '<div class="wcss-copied-to-clipboard">' + wcssObj.icons.check + '</div>' );

					/**
					 * Email cart trigger.
					 *
					 * @since 1.8.3
					 */
					$( document.body ).trigger( 'wcss_email_cart', { post_data : form.serialize() } );
				}
			}
		} );
	} );

	/**
	 * Save cart ajax handler.
	 *
	 * @since 1.9.3
	 */
	$( document ).on( 'submit', '#wcss-save-cart-form', function( e ) {
		e.preventDefault();

		wcss.show_loader();

		$.ajax( {
			url: wcssObj.ajax_url,
			type: 'post',
			data: $( this ).serialize() + '&action=wcss_save_cart_ajax',
			success: function( r ) {
				if ( wcssObj.saved_cart_endpoint_url ) {
					window.location.href = wcssObj.saved_cart_endpoint_url;
				}

				$( '.wcss-popup-ajax' ).html( '<div class="wcss-copied-to-clipboard">' + wcssObj.icons.check + '</div>' );

				/**
				 * Saved cart trigger
				 *
				 * @since 1.9.3
				 */
				$( document.body ).trigger( 'wcss_saved_cart' );
			}
		} );
	} );

} )( jQuery )
