/*!
 * Jetpack CRM
 * https://jetpackcrm.com
 * V1.0
 *
 * Copyright 2020 Automattic
 *
 * Date: 17/06/2016
 */

/* global moment, ajaxurl */

window.zbscrmjsCustomerFilterRetrieving = false;
window.zbscrmjsCustomerFilterHasRetrieved = false;

// Following was first used in mail campaigns v1.0
// it auto-initiates on any zbs customfilter ajax setups :)
// it's requried for mailcampaigns :)
//jQuery(function(){

//});

// generic funcs to be called from other JS
/**
 * Bind date range picker to element.
 * @param {string} dateRangeSelector - Daterange selector.
 */
function zbscrmJS_customfilters_bindDateRange( dateRangeSelector ) {
	// Debug console.log('zbscrmJS_customfilters_bindDateRange',dateRangeSelector);

	// Date Range Picker
	jQuery( dateRangeSelector ).daterangepicker(
		{
			autoUpdateInput: false,
			locale: { format: 'DD.MM.YYYY', cancelLabel: 'Clear' },
			ranges: {
				Today: [ moment(), moment() ],
				Yesterday: [ moment().subtract( 1, 'days' ), moment().subtract( 1, 'days' ) ],
				'Last 7 Days': [ moment().subtract( 6, 'days' ), moment() ],
				'Last 30 Days': [ moment().subtract( 29, 'days' ), moment() ],
				'This Month': [ moment().startOf( 'month' ), moment().endOf( 'month' ) ],
				'Last Month': [
					moment().subtract( 1, 'month' ).startOf( 'month' ),
					moment().subtract( 1, 'month' ).endOf( 'month' ),
				],
			},
		},
		zbsJSFilterDateRangeCallback
	);
	jQuery( dateRangeSelector ).on( 'cancel.daterangepicker', function () {
		jQuery( this ).val( '' );
		zbsJSFilterDateRangeClear();
	} );
}
/**
 * Bind AJAX filter call to button.
 *
 * @param {string}   formSelector   - Form selector.
 * @param {string}   buttonSelector - Button selector.
 * @param {Function} cb             - Callback on success.
 * @param {Function} errcb          - Callback on error.
 */
function zbscrmJS_customfilters_bindAjaxButton( formSelector, buttonSelector, cb, errcb ) {
	// Debug console.log('zbscrmJS_customfilters_bindAjaxButton',[formSelector,buttonSelector,cb,errcb]);

	// ajax filter
	jQuery( buttonSelector )
		.off( 'click' )
		.on( 'click', function () {
			if ( ! window.zbscrmjsCustomerFilterRetrieving ) {
				// loading + blocker
				window.zbscrmjsCustomerFilterRetrieving = true;
				jQuery( formSelector + ' .zbs-crm-customerfilter-ajax-output' )
					.show()
					.html( '<i class="fa fa-circle-o-notch fa-spin"></i>' );

				// clear filters in effect obj
				window.zbscrmjs_mailExt_CustomerFiltersInEffect = 'none';

				//Debug console.log("zbs-ajax-customer-filters:");

				// postbag!
				const data = {
					action: 'filterCustomers',
					sec: window.zbscrmjs_secToken,
					// rest is filter data, added below
				};

				// inputs + select
				jQuery( formSelector + ' :input, ' + formSelector + ' select' ).each( function () {
					// checkboxes
					if ( jQuery( this ).attr( 'type' ) !== 'checkbox' ) {
						data[ this.name ] = jQuery( this ).val();
					} else if ( jQuery( this ).attr( 'checked' ) ) {
						data[ this.name ] = jQuery( this ).val();
					}
				} );

				//Debug console.log("Sending AJAX DATA:",data);

				// Send
				jQuery.ajax( {
					type: 'POST',
					url: ajaxurl, // admin side is just ajaxurl not wptbpAJAX.ajaxurl,
					data: data,
					dataType: 'json',
					timeout: 20000,
					success: function ( response ) {
						//Debug console.log("RESPONSE",response);
						// blocker
						window.zbscrmjsCustomerFilterRetrieving = false;

						// Update UI
						if ( typeof response.count !== 'undefined' ) {
							jQuery( formSelector + ' .zbs-crm-customerfilter-ajax-output' ).html(
								'<i class="fa fa-users"></i> <strong>' + response.count + '</strong> Contacts Found'
							);

							// callback
							if ( typeof cb === 'function' ) {
								cb( response );
							}
						} else {
							jQuery( formSelector + ' .zbs-crm-customerfilter-ajax-output' ).html(
								'<i class="fa fa-user-times"></i> No contacts found matching these filters'
							);
						}
					},
					error: function ( response ) {
						// eslint-disable-next-line no-console
						console.error( 'RESPONSE', response );

						// if has retrieved, this is normal error
						if ( window.zbscrmjsCustomerFilterHasRetrieved ) {
							// blocker
							window.zbscrmjsCustomerFilterRetrieving = false;

							//Debug

							// callback
							if ( typeof errcb === 'function' ) {
								errcb( response );
							}

							// UI
							jQuery( formSelector + ' .zbs-crm-customerfilter-ajax-output' ).html(
								'<i class="fa fa-user-times"></i> Error Retrieving Contacts'
							);
						} else {
							// hasn't been able to retrieve, this is a sign of caching of big db.

							// has retrieved (for caching of large dbs)
							window.zbscrmjsCustomerFilterHasRetrieved = true;

							// blocker
							window.zbscrmjsCustomerFilterRetrieving = false;

							// callback
							if ( typeof errcb === 'function' ) {
								errcb( response );
							}

							// UI
							jQuery( formSelector + ' .zbs-crm-customerfilter-ajax-output' ).html(
								'<i class="fa fa-tachometer"></i> It\'s taking some time to retrieve your contacts.<br />If you have a large database of contacts, this initial query can take some time.<br /><strong>Please try again in a few minutes</strong>, (after your contacts are cached, this\'ll be fast!)'
							);
						}
					},
				} );
			} // end blocker
		} );
}

/**
 * Format span when selecting a new date range.
 *
 * @param {object} start - Start moment.js object.
 * @param {object} end   - End moment.js object.
 */
function zbsJSFilterDateRangeCallback( start, end ) {
	jQuery( '#zbs-crm-customerfilter-addedrange-reportrange span' ).html(
		start.format( 'MMMM D, YYYY' ) + ' - ' + end.format( 'MMMM D, YYYY' )
	);
	jQuery( '#zbs-crm-customerfilter-addedrange' ).val(
		start.format( 'MMMM D, YYYY' ) + ' - ' + end.format( 'MMMM D, YYYY' )
	);
}
/**
 * Clear date range span.
 */
function zbsJSFilterDateRangeClear() {
	jQuery( '#zbs-crm-customerfilter-addedrange-reportrange span' ).html( '' );
	jQuery( '#zbs-crm-customerfilter-addedrange' ).val( '' );
}

if ( typeof module !== 'undefined' ) {
	module.exports = {
		zbscrmJS_customfilters_bindDateRange,
		zbscrmJS_customfilters_bindAjaxButton,
		zbsJSFilterDateRangeCallback,
		zbsJSFilterDateRangeClear,
	};
}