/* eslint-disable eqeqeq, no-console */
/* global swal, zbscrm_JS_validateEmail, ajaxurl, jpcrm */

const zeroBSCRMJS_SMTPWiz = {
	sendFromName: '',
	sendFromEmail: '',
	serverType: 'wp_mail',
	smtpHost: '',
	smtpPort: '',
	smtpUser: '',
	smtpPass: '',
};

/**
 * Refresh the page
 */
function zeroBSCRMJS_refreshPage() {
	window.location = window.zbs_root.current_url;
}

jQuery( function () {
	// bind
	zeroBSCRMJS_mail_delivery_bindWizard();
	zeroBSCRMJS_mail_delivery_bindList();
} );

// defaults for test delivery pass through for SWAL
window.zbsTestDelivery = false;

/**
 * Bind listview stuff.
 */
function zeroBSCRMJS_mail_delivery_bindList() {
	jQuery( '.zbs-test-mail-delivery' )
		.off( 'click' )
		.on( 'click', function () {
			// get deets
			let emailFrom = '',
				emailIndx = -1;

			emailIndx = jQuery( this ).attr( 'data-indx' );
			emailFrom = jQuery( this ).attr( 'data-from' );

			swal( {
				titleText: window.zeroBSCRMJS_globViewLang( 'sendTestMail' ) + ' "' + emailFrom + '"',
				//text: window.zeroBSCRMJS_globViewLang('sendTestWhere'),
				input: 'email',
				inputValue: emailFrom, // prefill with itself
				showCancelButton: true,
				confirmButtonText: jpcrm.esc_html( window.zeroBSCRMJS_globViewLang( 'sendTestButton' ) ),
				showLoaderOnConfirm: true,
				preConfirm: function ( email ) {
					return new Promise( function ( resolve, reject ) {
						// localise indx
						const lIndx = emailIndx;

						// timeout for loading
						setTimeout( function () {
							if ( ! zbscrm_JS_validateEmail( email ) ) {
								reject( window.zeroBSCRMJS_globViewLang( 'pleaseEnterEmail' ) );
							} else {
								const data = {
									action: 'zbs_maildelivery_test',
									indx: lIndx,
									em: email,
									sec: window.zbs_root.jpcrm_nonce,
								};

								// Send it Pat :D
								jQuery.ajax( {
									type: 'POST',
									url: ajaxurl,
									data: data,
									dataType: 'json',
									timeout: 20000,
									success: function () {
										// localise
										const lEmail = email;

										window.zbsTestDelivery = 'success';
										window.zbsTestDeliveryMsg =
											window.zeroBSCRMJS_globViewLang( 'sendTestSentSuccess' ) + ' ' + lEmail;

										resolve();
									},
									error: function () {
										window.zbsTestDelivery = 'fail';
										window.zbsTestDeliveryMsg =
											window.zeroBSCRMJS_globViewLang( 'sendTestSentFailed' );

										resolve();
									},
								} );
							}
						}, 2000 );
					} );
				},
				allowOutsideClick: false,
			} )
				.then( function () {
					if ( window.zbsTestDelivery === 'success' ) {
						swal( {
							type: 'success',
							titleText: window.zeroBSCRMJS_globViewLang( 'sendTestSent' ),
							text: window.zbsTestDeliveryMsg,
						} );
					} else {
						swal( {
							type: 'warning',
							titleText: window.zeroBSCRMJS_globViewLang( 'sendTestFail' ),
							text: window.zbsTestDeliveryMsg,
						} );
					}
				} )
				.catch( swal.noop );
		} );

	// REMOVE one :)
	jQuery( '.zbs-remove-mail-delivery' )
		.off( 'click' )
		.on( 'click', function () {
			// get deets
			let emailIndx = -1;

			emailIndx = jQuery( this ).attr( 'data-indx' );

			swal( {
				titleText: window.zeroBSCRMJS_globViewLang( 'deleteMailDeliverySureTitle' ),
				text: window.zeroBSCRMJS_globViewLang( 'deleteMailDeliverySureText' ),
				type: 'warning',
				showCancelButton: true,
				confirmButtonColor: '#3085d6',
				cancelButtonColor: '#d33',
				confirmButtonText: jpcrm.esc_html(
					window.zeroBSCRMJS_globViewLang( 'deleteMailDeliverySureConfirm' )
				),
			} ).then( function ( result ) {
				if ( result.value ) {
					// localise indx
					const lIndx = emailIndx;

					const data = {
						action: 'zbs_maildelivery_remove',
						indx: lIndx,
						sec: window.zbs_root.jpcrm_nonce,
					};

					// Send it Pat :D
					jQuery.ajax( {
						type: 'POST',
						url: ajaxurl,
						data: data,
						dataType: 'json',
						timeout: 20000,
						success: function ( response ) {
							console.log( 'del', response );

							swal( {
								titleText: window.zeroBSCRMJS_globViewLang( 'deleteMailDeliverySureDeletedTitle' ),
								text: window.zeroBSCRMJS_globViewLang( 'deleteMailDeliverySureDeletedText' ),
								type: 'success',
								// refresh onClose: zeroBSCRMJS_refreshPage
								onClose: function () {
									// remove line
									const llIndx = lIndx;
									jQuery( '#zbs-mail-delivery-' + llIndx ).hide();
								},
							} );
						},
						error: function ( response ) {
							console.error( 'del', response );

							swal( {
								titleText: window.zeroBSCRMJS_globViewLang(
									'deleteMailDeliverySureDeleteErrTitle'
								),
								text: window.zeroBSCRMJS_globViewLang( 'deleteMailDeliverySureDeleteErrText' ),
								type: 'warning',
							} );
						},
					} );
				}
			} );
		} );

	// Set as default
	jQuery( '.zbs-default-mail-delivery' )
		.off( 'click' )
		.on( 'click', function () {
			// get deets
			let emailIndx = -1;

			emailIndx = jQuery( this ).attr( 'data-indx' );

			swal( {
				titleText: window.zeroBSCRMJS_globViewLang( 'defaultMailDeliverySureTitle' ),
				text: window.zeroBSCRMJS_globViewLang( 'defaultMailDeliverySureText' ),
				type: 'warning',
				showCancelButton: true,
				confirmButtonColor: '#3085d6',
				cancelButtonColor: '#d33',
				confirmButtonText: jpcrm.esc_html(
					window.zeroBSCRMJS_globViewLang( 'defaultMailDeliverySureConfirm' )
				),
			} ).then( function () {
				// localise indx
				const lIndx = emailIndx;

				const data = {
					action: 'zbs_maildelivery_setdefault',
					indx: lIndx,
					sec: window.zbs_root.jpcrm_nonce,
				};

				// Send it Pat :D
				jQuery.ajax( {
					type: 'POST',
					url: ajaxurl,
					data: data,
					dataType: 'json',
					timeout: 20000,
					success: function ( response ) {
						console.log( 'def', response );

						swal( {
							titleText: window.zeroBSCRMJS_globViewLang( 'defaultMailDeliverySureDeletedTitle' ),
							text: window.zeroBSCRMJS_globViewLang( 'defaultMailDeliverySureDeletedText' ),
							type: 'success',
							// refresh onClose: zeroBSCRMJS_refreshPage
							onClose: function () {
								// remove other default labels + inject
								jQuery(
									'#zbs-mail-delivery-account-list-wrap td.zbs-mail-delivery-item-details .zbs-default'
								).remove();
								// undisable as well
								jQuery(
									'#zbs-mail-delivery-account-list-wrap .zbs-default-mail-delivery.disabled'
								).removeClass( 'disabled' );

								const llIndx = lIndx;
								jQuery(
									'#zbs-mail-delivery-' + llIndx + ' td.zbs-mail-delivery-item-details'
								).prepend(
									'<div class="ui ribbon label zbs-default">' +
										jpcrm.esc_html( window.zeroBSCRMJS_globViewLang( 'defaultText' ) ) +
										'</div>'
								);
								jQuery(
									'#zbs-mail-delivery-' + llIndx + ' .ui.button.zbs-default-mail-delivery'
								).addClass( 'disabled' );
							},
						} );
					},
					error: function ( response ) {
						console.error( 'def', response );

						swal( {
							titleText: window.zeroBSCRMJS_globViewLang( 'defaultMailDeliverySureDeleteErrTitle' ),
							text: window.zeroBSCRMJS_globViewLang( 'defaultMailDeliverySureDeleteErrText' ),
							type: 'warning',
						} );
					},
				} );
			} );
		} );
}

let oauth_profile_key = '';

/**
 * Bind wizard functions.
 */
function zeroBSCRMJS_mail_delivery_bindWizard() {
	// any of these?
	jQuery( '.ui.radio.checkbox' ).checkbox();

	// start wiz
	jQuery( '#zbs-mail-delivery-start-wizard' )
		.off( 'click' )
		.on( 'click', function () {
			// hide bits classed .zbs-non-wizard
			jQuery( '.zbs-non-wizard', jQuery( '#zbs-mail-delivery-wrap' ) ).hide();

			// show wiz
			jQuery( '#zbs-mail-delivery-wizard-wrap' ).show();
		} );

	// step 1

	// submit
	jQuery( '#zbs-mail-delivery-wizard-step-1-submit' )
		.off( 'click' )
		.on( 'click', function () {
			// test inputs & move on to step 2
			let okayToProceed = true;
			const sendFromName = jQuery( '#zbs-mail-delivery-wizard-sendfromname' ).val();
			const sendFromEmail = jQuery( '#zbs-mail-delivery-wizard-sendfromemail' ).val();

			// send from name
			if ( sendFromName.length > 0 ) {
				// set it
				window.zeroBSCRMJS_SMTPWiz.sendFromName = sendFromName;

				// hide any msg
				jQuery( '#zbs-mail-delivery-wizard-sendfromname-error' )
					.text( window.zeroBSCRMJS_globViewLang( 'thanks' ) )
					.addClass( 'hidden' );
			} else {
				// not okay
				okayToProceed = false;

				// msg
				jQuery( '#zbs-mail-delivery-wizard-sendfromname-error' )
					.text( window.zeroBSCRMJS_globViewLang( 'pleaseEnter' ) )
					.removeClass( 'hidden' );
			}

			// send from email
			if ( sendFromEmail.length > 0 && zbscrm_JS_validateEmail( sendFromEmail ) ) {
				// set it
				window.zeroBSCRMJS_SMTPWiz.sendFromEmail = sendFromEmail;

				// hide any msg
				jQuery( '#zbs-mail-delivery-wizard-sendfromemail-error' )
					.text( window.zeroBSCRMJS_globViewLang( 'thanks' ) )
					.addClass( 'hidden' );
			} else {
				// not okay
				okayToProceed = false;

				// msg
				jQuery( '#zbs-mail-delivery-wizard-sendfromemail-error' )
					.text( window.zeroBSCRMJS_globViewLang( 'pleaseEnterEmail' ) )
					.removeClass( 'hidden' );
			}

			// okay?
			if ( okayToProceed ) {
				jQuery( '#zbs-mail-delivery-wizard-step-1-wrap' ).hide();
				jQuery( '#zbs-mail-delivery-wizard-step-2-wrap' ).show();

				jQuery( '.zbs-top-step-1' ).removeClass( 'active' );
				jQuery( '.zbs-top-step-2' ).removeClass( 'disabled' ).addClass( 'active' );

				// Pre-fill user on next step SMTP ...
				if ( jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-user' ).val() == '' ) {
					jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-user' ).val( sendFromEmail );
				}
			}
		} );

	// Step 2
	jQuery( '#zbs-mail-delivery-wizard-step-2-wrap .ui.radio.checkbox' ).on( 'click', function () {
		// check mode
		let serverType = 'wp_mail';
		if ( jQuery( '#zbs-mail-delivery-wizard-step-2-servertype-smtp' ).checkbox( 'is checked' ) ) {
			serverType = 'smtp';
		}
		if (
			jQuery( '#jpcrm-mail-delivery-wizard-step-2-servertype-oauth' ).checkbox( 'is checked' )
		) {
			serverType = 'api';
		}

		// show hide
		if ( serverType == 'smtp' ) {
			jQuery( '#jpcrm-mail-delivery-wizard-step-2-api' ).hide();
			jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-wrap' ).show();
			jQuery( '#zbs-mail-delivery-wizard-step-2-prefill-smtp' ).show();
			jQuery( '.jpcrm-mail-delivery-wizard-step-2-spacer' ).show();
		} else if ( serverType == 'api' ) {
			jQuery( '#jpcrm-mail-delivery-wizard-step-2-api' ).show();
			jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-wrap' ).hide();
			jQuery( '#zbs-mail-delivery-wizard-step-2-prefill-smtp' ).hide();
			jQuery( '.jpcrm-mail-delivery-wizard-step-2-spacer' ).show();
		} else {
			jQuery( '#jpcrm-mail-delivery-wizard-step-2-api' ).hide();
			jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-wrap' ).hide();
			jQuery( '#zbs-mail-delivery-wizard-step-2-prefill-smtp' ).hide();
			jQuery( '.jpcrm-mail-delivery-wizard-step-2-spacer' ).hide();
		}
	} );

	// back button
	jQuery( '#zbs-mail-delivery-wizard-step-2-back' )
		.off( 'click' )
		.on( 'click', function () {
			jQuery( '#zbs-mail-delivery-wizard-step-1-wrap' ).show();
			jQuery( '#zbs-mail-delivery-wizard-step-2-wrap' ).hide();

			jQuery( '.zbs-top-step-1' ).removeClass( 'disabled' ).addClass( 'active' );
			jQuery( '.zbs-top-step-2' ).removeClass( 'active' ).addClass( 'disabled' );
		} );

	// quickfill smtp
	jQuery( '#zbs-mail-delivery-wizard-step-2-prefill-smtp select' )
		.off( 'change' )
		.on( 'change', function () {
			// debug console.log(jQuery('#zbs-mail-delivery-wizard-step-2-prefill-smtp select').val());
			const v = jQuery( '#zbs-mail-delivery-wizard-step-2-prefill-smtp select' ).val();

			// find deets
			jQuery( '#zbs-mail-delivery-wizard-step-2-prefill-smtp select option' ).each(
				function ( ind, ele ) {
					if ( jQuery( ele ).val() == v && window.zbs_root.smtp_providers[ v ] ) {
						const smtp_settings = window.zbs_root.smtp_providers[ v ];

						// fill out + break
						jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-host' ).val( smtp_settings.host );
						jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-port' ).val( smtp_settings.port );
						jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-user' ).attr(
							'placeholder',
							smtp_settings.example
						);
						if ( ! smtp_settings.description ) {
							smtp_settings.description = '';
						}
						jQuery( '#jpcrm-maildelivery-description' ).html( smtp_settings.description );

						return true;
					}
				}
			);
		} );

	// check over deets
	jQuery( '#zbs-mail-delivery-wizard-step-2-submit' )
		.off( 'click' )
		.on( 'click', function () {
			// test inputs & move on to step 2
			let okayToProceed = true;

			// wpmail or smtp?
			let serverType = 'wp_mail';
			if ( jQuery( '#zbs-mail-delivery-wizard-step-2-servertype-smtp' ).checkbox( 'is checked' ) ) {
				serverType = 'smtp';
			}
			if (
				jQuery( '#jpcrm-mail-delivery-wizard-step-2-servertype-oauth' ).checkbox( 'is checked' )
			) {
				serverType = 'api';
			}

			// smtp?
			if ( serverType == 'smtp' ) {
				const smtpHost = jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-host' ).val();
				const smtpPort = jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-port' ).val();
				const smtpUser = jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-user' ).val();
				const smtpPass = jQuery( '#zbs-mail-delivery-wizard-step-2-smtp-pass' ).val();

				// first check lengths of them all

				if ( smtpHost.length > 0 ) {
					// set it
					window.zeroBSCRMJS_SMTPWiz.smtpHost = smtpHost;
					// hide any msg
					jQuery( '#zbs-mail-delivery-wizard-smtphost-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'thanks' ) )
						.addClass( 'hidden' );
				} else {
					// not okay
					okayToProceed = false;
					// msg
					jQuery( '#zbs-mail-delivery-wizard-smtphost-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'pleaseEnter' ) )
						.removeClass( 'hidden' );
				}

				if ( smtpPort.length > 0 ) {
					// set it
					window.zeroBSCRMJS_SMTPWiz.smtpPort = smtpPort;
					// hide any msg
					jQuery( '#zbs-mail-delivery-wizard-smtpport-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'thanks' ) )
						.addClass( 'hidden' );
				} else {
					// not okay
					okayToProceed = false;
					// msg
					jQuery( '#zbs-mail-delivery-wizard-smtpport-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'pleaseEnter' ) )
						.removeClass( 'hidden' );
				}

				if ( smtpUser.length > 0 ) {
					// set it
					window.zeroBSCRMJS_SMTPWiz.smtpUser = smtpUser;
					// hide any msg
					jQuery( '#zbs-mail-delivery-wizard-smtpuser-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'thanks' ) )
						.addClass( 'hidden' );
				} else {
					// not okay
					okayToProceed = false;
					// msg
					jQuery( '#zbs-mail-delivery-wizard-smtpuser-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'pleaseEnter' ) )
						.removeClass( 'hidden' );
				}

				if ( smtpPass.length > 0 ) {
					// set it
					window.zeroBSCRMJS_SMTPWiz.smtpPass = smtpPass;
					// hide any msg
					jQuery( '#zbs-mail-delivery-wizard-smtppass-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'thanks' ) )
						.addClass( 'hidden' );
				} else {
					// not okay
					okayToProceed = false;
					// msg
					jQuery( '#zbs-mail-delivery-wizard-smtppass-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'pleaseEnter' ) )
						.removeClass( 'hidden' );
				}
			} // end if smtp

			// wpmail
			if ( serverType == 'wp_mail' ) {
				// no validation req.
			} // end if wpmail

			// API Oauth
			if ( serverType == 'api' ) {
				// got a valid connection?
				oauth_profile_key = jQuery( '#jpcrm-mail-delivery-wizard-step-2-api select' ).val();
				if ( oauth_profile_key ) {
					jQuery( '#zbs-mail-delivery-wizard-oauth-error' ).addClass( 'hidden' );
					window.zeroBSCRMJS_SMTPWiz.oauth_profile_key = oauth_profile_key;
				} else {
					okayToProceed = false;
					jQuery( '#zbs-mail-delivery-wizard-oauth-error' )
						.text( window.zeroBSCRMJS_globViewLang( 'oauthConnection' ) )
						.removeClass( 'hidden' );
					window.zeroBSCRMJS_SMTPWiz.oauth_profile_key = false;
				}
			} // end if API OAuth

			// okay?
			if ( okayToProceed ) {
				jQuery( '#zbs-mail-delivery-wizard-step-2-wrap' ).hide();
				jQuery( '#zbs-mail-delivery-wizard-step-3-wrap' ).show();

				jQuery( '.zbs-top-step-2' ).removeClass( 'active' );
				jQuery( '.zbs-top-step-3' ).removeClass( 'disabled' ).addClass( 'active' );

				// start validator
				zeroBSCRMJS_validateSettings();
			}
		} );

	// back button
	jQuery( '#zbs-mail-delivery-wizard-step-3-back' )
		.off( 'click' )
		.on( 'click', function () {
			jQuery( '#zbs-mail-delivery-wizard-step-2-wrap' ).show();
			jQuery( '#zbs-mail-delivery-wizard-step-3-wrap' ).hide();

			jQuery( '.zbs-top-step-2' ).removeClass( 'disabled' ).addClass( 'active' );
			jQuery( '.zbs-top-step-3' ).removeClass( 'active' ).addClass( 'disabled' );
		} );

	// fini button
	jQuery( '#zbs-mail-delivery-wizard-step-3-submit' )
		.off( 'click' )
		.on( 'click', function () {
			window.location = window.zbs_root.current_url;
		} );
}

/**
 * takes settings in window.zeroBSCRMJS_SMTPWiz and attempts to validate
 * (assumes present values)
 */
function zeroBSCRMJS_validateSettings() {
	/* window.zeroBSCRMJS_SMTPWiz
			sendFromName: '',
			sendFromEmail: '',
			serverType: 'wp_mail',
			smtpHost: '',
			smtpPort: '',
			smtpUser: '',
			smtpPass: ''
			*/

	let serverType = 'wp_mail';
	if ( jQuery( '#zbs-mail-delivery-wizard-step-2-servertype-smtp' ).checkbox( 'is checked' ) ) {
		serverType = 'smtp';
	}
	if ( jQuery( '#jpcrm-mail-delivery-wizard-step-2-servertype-oauth' ).checkbox( 'is checked' ) ) {
		serverType = 'api';
	}

	// step through:
	//<i class="terminal icon"></i>
	//<i class="handshake icon"></i>
	//<i class="mail outline icon"></i>
	//<i class="open envelope outline icon"></i>

	// clear prev debug
	jQuery( '#zbs-mail-delivery-wizard-admdebug' ).html( '' ).hide();

	switch ( serverType ) {
		case 'wp_mail': {
			// easy - fire of a test via ajax, but will "work" in as far as validation

			// loading
			jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).addClass( 'loading' );

			// postbag! - NOTE: This also adds a new Mail Delivery line to the options (or updates an old one with same email)
			const data = {
				action: 'zbs_maildelivery_validation_wp_mail',
				sendFromName: window.zeroBSCRMJS_SMTPWiz.sendFromName,
				sendFromEmail: window.zeroBSCRMJS_SMTPWiz.sendFromEmail,
				sec: window.zbs_root.jpcrm_nonce,
			};

			jQuery.ajax( {
				type: 'POST',
				url: ajaxurl,
				data: data,
				dataType: 'json',
				timeout: 20000,
				success: function ( response ) {
					// remove loading
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' )
						.removeClass( 'loading' )
						.html( '<i class="open envelope outline icon"></i>' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console' ).html( '' );

					// success?
					if ( typeof response.success !== 'undefined' ) {
						// show result
						const resHTML =
							jpcrm.esc_html( window.zeroBSCRMJS_globViewLang( 'settingsValidatedWPMail' ) ) +
							'<div class="zbs-validated">' +
							jpcrm.esc_html( window.zeroBSCRMJS_SMTPWiz.sendFromEmail ) +
							'</div>';
						jQuery( '#zbs-mail-delivery-wizard-validate-console' ).html( resHTML );

						// enable finish button, remove back button
						jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).hide();
						jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).show().removeClass( 'disabled' );
					} else {
						// some kind of error, suggest retry
						const resHTML = window.zeroBSCRMJS_globViewLang( 'settingsValidatedWPMailError' );
						jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );
						jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
							'<i class="warning sign icon"></i>'
						);

						// enable back button, disable finish button
						jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
						jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );
					}
				},
				error: function () {
					// remove loading
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).removeClass( 'loading' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
						'<i class="warning sign icon"></i>'
					);

					// some kind of error, suggest retry
					const resHTML = window.zeroBSCRMJS_globViewLang( 'settingsValidatedWPMailError' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );

					// enable back button, disable finish button
					jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
					jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );
				},
			} );

			break;
		}

		case 'smtp': {
			// less easy - fire of a test via ajax, return varied responses :)

			// loading
			jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).addClass( 'loading' );
			jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text(
				window.zeroBSCRMJS_globViewLang( 'settingsValidateSMTPPortCheck' )
			);

			// FIRST check ports open (step 1)
			const data = {
				action: 'zbs_maildelivery_validation_smtp_ports',
				smtpHost: window.zeroBSCRMJS_SMTPWiz.smtpHost,
				smtpPort: window.zeroBSCRMJS_SMTPWiz.smtpPort,
				sec: window.zbs_root.jpcrm_nonce,
			};

			jQuery.ajax( {
				type: 'POST',
				url: ajaxurl,
				data: data,
				dataType: 'json',
				timeout: 60000,
				success: function ( response ) {
					if ( typeof response.open !== 'undefined' && response.open ) {
						// NORMAL - validate smtp via send:
						jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text(
							window.zeroBSCRMJS_globViewLang( 'settingsValidateSMTPProbing' )
						);

						// postbag! - NOTE: This also adds a new Mail Delivery line to the options (or updates an old one with same email)
						const validationData = {
							action: 'zbs_maildelivery_validation_smtp',
							sendFromName: window.zeroBSCRMJS_SMTPWiz.sendFromName,
							sendFromEmail: window.zeroBSCRMJS_SMTPWiz.sendFromEmail,
							smtpHost: window.zeroBSCRMJS_SMTPWiz.smtpHost,
							smtpPort: window.zeroBSCRMJS_SMTPWiz.smtpPort,
							smtpUser: window.zeroBSCRMJS_SMTPWiz.smtpUser,
							smtpPass: window.zeroBSCRMJS_SMTPWiz.smtpPass,
							sec: window.zbs_root.jpcrm_nonce,
						};

						// Send it Pat :D
						jQuery.ajax( {
							type: 'POST',
							url: ajaxurl,
							data: validationData,
							dataType: 'json',
							timeout: 60000,
							success: function ( validationResponse ) {
								// console.log('SMTP',response);

								// 2.94.2 we also added hidden output of all debugs (click to show)
								if ( typeof validationResponse.debugs !== 'undefined' ) {
									let debugStr = '';
									if ( validationResponse.debugs.length > 0 ) {
										jQuery.each( validationResponse.debugs, function ( ind, ele ) {
											debugStr += '<hr />' + jpcrm.esc_html( ele );
										} );
									}
									jQuery( '#zbs-mail-delivery-wizard-admdebug' ).html(
										'<strong>Debug Log</strong>:<br />' + debugStr
									);
								}

								// remove loading + play routine for now (no separate ajax tests here)
								jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text(
									window.zeroBSCRMJS_globViewLang( 'settingsValidateSMTPProbing' )
								);
								jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' )
									.removeClass( 'loading' )
									.html( '<i class="terminal icon"></i>' );

								setTimeout( function () {
									// attempting to send msg
									jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text(
										window.zeroBSCRMJS_globViewLang( 'settingsValidateSMTPAttempt' )
									);
									jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
										'<i class="terminal icon"></i>'
									);

									// fly or die:

									// success?
									if ( typeof response.success !== 'undefined' && response.success ) {
										// sent
										let resHTML = window.zeroBSCRMJS_globViewLang( 'settingsValidateSMTPSuccess' );
										jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );
										jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
											'<i class="mail outline icon"></i>'
										);

										setTimeout( function () {
											//console.log('x',window.zeroBSCRMJS_SMTPWiz.smtpHost);
											// show result
											resHTML =
												jpcrm.esc_html(
													window.zeroBSCRMJS_globViewLang( 'settingsValidatedSMTP' )
												) +
												'<div class="zbs-validated">' +
												jpcrm.esc_html( window.zeroBSCRMJS_SMTPWiz.sendFromEmail ) +
												'</div>';
											jQuery( '#zbs-mail-delivery-wizard-validate-console' ).html( resHTML );
											jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
												'<i class="open envelope outline icon"></i>'
											);

											// enable finish button, remove back button
											jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).hide();
											jQuery( '#zbs-mail-delivery-wizard-step-3-submit' )
												.show()
												.removeClass( 'disabled' );

											setTimeout( function () {
												// bind show debug
												jQuery( '#zbs-mail-delivery-showdebug' )
													.off( 'click' )
													.on( 'click', function ( e ) {
														jQuery( '#zbs-mail-delivery-wizard-admdebug' ).toggle();
														e.preventDefault();
													} );
											}, 0 );
										}, 1000 );
									} else {
										// some kind of error, suggest retry
										const resHTML = window.zeroBSCRMJS_globViewLang(
											'settingsValidatedSMTPProbeError'
										);
										jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );
										jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
											'<i class="warning sign icon"></i>'
										);

										// enable back button, disable finish button
										jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
										jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );

										// bind show debug
										jQuery( '#zbs-mail-delivery-showdebug' )
											.off( 'click' )
											.on( 'click', function () {
												jQuery( '#zbs-mail-delivery-wizard-admdebug' ).toggle();
											} );

										setTimeout( function () {
											// bind show debug
											jQuery( '#zbs-mail-delivery-showdebug' )
												.off( 'click' )
												.on( 'click', function ( e ) {
													jQuery( '#zbs-mail-delivery-wizard-admdebug' ).toggle();
													e.preventDefault();
												} );
										}, 0 );
									}
								}, 1000 );

								setTimeout( function () {
									// bind show debug
									jQuery( '#zbs-mail-delivery-showdebug' )
										.off( 'click' )
										.on( 'click', function ( e ) {
											jQuery( '#zbs-mail-delivery-wizard-admdebug' ).toggle();
											e.preventDefault();
										} );
								}, 0 );
							},
							error: function () {
								// debug (likely timed out)
								jQuery( '#zbs-mail-delivery-wizard-admdebug' ).html(
									'<strong>Debug Log</strong>:<br />' +
										jpcrm.esc_html( window.zeroBSCRMJS_globViewLang( 'likelytimeout' ) )
								);

								// remove loading
								jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).removeClass( 'loading' );
								jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
									'<i class="warning sign icon"></i>'
								);

								// some kind of error, suggest retry
								const resHTML = window.zeroBSCRMJS_globViewLang(
									'settingsValidatedSMTPGeneralError'
								);
								jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );

								// enable back button, disable finish button
								jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
								jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );

								setTimeout( function () {
									// bind show debug
									jQuery( '#zbs-mail-delivery-showdebug' )
										.off( 'click' )
										.on( 'click', function ( e ) {
											jQuery( '#zbs-mail-delivery-wizard-admdebug' ).toggle();
											e.preventDefault();
										} );
								}, 0 );
							},
						} );
					} // had open ports
					else if ( typeof response.debugs !== 'undefined' ) {
						let debugStr = '';
						if ( response.debugs.length > 0 ) {
							jQuery.each( response.debugs, function ( ind, ele ) {
								debugStr += '<hr />' + ele;
							} );
						}
						jQuery( '#zbs-mail-delivery-wizard-admdebug' ).html(
							'<strong>Debug Log (Ports Blocked)</strong>:<br />' + debugStr
						);

						// remove loading
						jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).removeClass( 'loading' );
						jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
							'<i class="warning sign icon"></i>'
						);

						// some kind of error, suggest retry
						const resHTML = window.zeroBSCRMJS_globViewLang( 'likelytimeout' );
						jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );

						// enable back button, disable finish button
						jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
						jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );

						setTimeout( function () {
							// bind show debug
							jQuery( '#zbs-mail-delivery-showdebug' )
								.off( 'click' )
								.on( 'click', function ( e ) {
									jQuery( '#zbs-mail-delivery-wizard-admdebug' ).toggle();
									e.preventDefault();
								} );
						}, 0 );
					}
				},
				error: function () {
					// debug (likely timed out)
					jQuery( '#zbs-mail-delivery-wizard-admdebug' ).html(
						'<strong>Debug Log (Ports Blocked)</strong>:<br />' +
							jpcrm.esc_html( window.zeroBSCRMJS_globViewLang( 'likelytimeout' ) )
					);

					// remove loading
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).removeClass( 'loading' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
						'<i class="warning sign icon"></i>'
					);

					// some kind of error, suggest retry
					const resHTML = window.zeroBSCRMJS_globViewLang( 'likelytimeout' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );

					// enable back button, disable finish button
					jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
					jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );

					setTimeout( function () {
						// bind show debug
						jQuery( '#zbs-mail-delivery-showdebug' )
							.off( 'click' )
							.on( 'click', function ( e ) {
								jQuery( '#zbs-mail-delivery-wizard-admdebug' ).toggle();
								e.preventDefault();
							} );
					}, 0 );
				},
			} );

			break;
		}

		// API OAuth methods
		case 'api': {
			// loading
			jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).addClass( 'loading' );

			// Build data args
			// Note this also adds a new Mail Delivery line to the options (or updates an old one with same email)
			const data = {
				action: 'jpcrm_maildelivery_validation_api',
				send_from_name: window.zeroBSCRMJS_SMTPWiz.sendFromName,
				send_from_email: window.zeroBSCRMJS_SMTPWiz.sendFromEmail,
				oauth_provider: window.zeroBSCRMJS_SMTPWiz.oauth_profile_key,
				sec: window.zbs_root.jpcrm_nonce,
			};

			// Send it Pat :D
			jQuery.ajax( {
				type: 'POST',
				url: ajaxurl,
				data: data,
				dataType: 'json',
				timeout: 20000,
				success: function ( response ) {
					// remove loading
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' )
						.removeClass( 'loading' )
						.html( '<i class="open envelope outline icon"></i>' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console' ).html( '' );

					// success?
					if ( typeof response.success !== 'undefined' ) {
						// show result
						const resHTML =
							jpcrm.esc_html( window.zeroBSCRMJS_globViewLang( 'settingsValidatedOAuth' ) ) +
							'<div class="zbs-validated">' +
							jpcrm.esc_html( window.zeroBSCRMJS_SMTPWiz.sendFromEmail ) +
							'</div>';
						jQuery( '#zbs-mail-delivery-wizard-validate-console' ).html( resHTML );

						// enable finish button, remove back button
						jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).hide();
						jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).show().removeClass( 'disabled' );
					} else {
						// some kind of error, suggest retry
						const resHTML = window.zeroBSCRMJS_globViewLang( 'settingsValidatedOAuthError' );
						jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );
						jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
							'<i class="warning sign icon"></i>'
						);

						// enable back button, disable finish button
						jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
						jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );
					}
				},
				error: function () {
					// remove loading
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).removeClass( 'loading' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console-ico' ).html(
						'<i class="warning sign icon"></i>'
					);

					// some kind of error, suggest retry
					const resHTML = window.zeroBSCRMJS_globViewLang( 'settingsValidatedOAuthError' );
					jQuery( '#zbs-mail-delivery-wizard-validate-console' ).text( resHTML );

					// enable back button, disable finish button
					jQuery( '#zbs-mail-delivery-wizard-step-3-back' ).show();
					jQuery( '#zbs-mail-delivery-wizard-step-3-submit' ).addClass( 'disabled' );
				},
			} );

			break;
		}
	} // / switch
}

if ( typeof module !== 'undefined' ) {
	module.exports = {
		zeroBSCRMJS_SMTPWiz,
		oauth_profile_key,
		zeroBSCRMJS_refreshPage,
		zeroBSCRMJS_mail_delivery_bindList,
		zeroBSCRMJS_mail_delivery_bindWizard,
		zeroBSCRMJS_validateSettings,
	};
}
