<?php

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'ES_Handle_Subscription' ) ) {
	/**
	 * Handle subscription
	 *
	 * Class ES_Handle_Subscription
	 *
	 * @since 4.0.0
	 */
	class ES_Handle_Subscription {

		/**
		 * Subscriber Email
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $email;

		/**
		 * Subscriber Name
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $name;

		/**
		 * Subscriber First Name
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $first_name;

		/**
		 * Subscriber Last Name
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $last_name;

		/**
		 * Optin type
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $es_optin_type;

		/**
		 * List Id
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $list_ids;

		/**
		 * List Hashes
		 *
		 * @since 4.6.12
		 * @var
		 */
		public $list_hashes;

		/**
		 * Nonce value
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $es_nonce;

		/**
		 * Subscriber Status
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $status;

		/**
		 * To check if double-optin or not
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $is_double_optin = false;

		/**
		 * Guid
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $guid;

		/**
		 * Database Id
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $db_id;

		/**
		 * Form id
		 *
		 * @since 4.0.0
		 * @var
		 */
		public $form_id;

		/**
		 * IP Address
		 *
		 * @since 4.7.3
		 * @var
		 */
		public $ip_address;

		/**
		 * Reference Site
		 *
		 * @since 5.4.0
		 * @var
		 */
		public $reference_site;

		/**
		 * If the user is subscribed from Rainmaker
		 *
		 * @since 4.0.0
		 * @var
		 */
		private $from_rainmaker = false;

	/**
	 * ES_Handle_Subscription constructor.
	 *
	 * @param bool $from_rainmaker
	 *
	 * @since 4.0.0
	 */
		public function __construct( $from_rainmaker = false ) {
			if ( defined( 'DOING_AJAX' ) && ( true === DOING_AJAX ) ) {
				add_action( 'wp_ajax_es_add_subscriber', array( $this, 'process_ajax_request' ), 10 );
				add_action( 'wp_ajax_nopriv_es_add_subscriber', array( $this, 'process_ajax_request' ), 10 );
			}

			$this->from_rainmaker = $from_rainmaker;

			$this->handle_subscription();
		}		/**
		 * Process form submission via ajax call
		 */
		public function process_ajax_request() {
			$es_subscribe = ! empty( $_POST['esfpx_es-subscribe'] ) ? sanitize_text_field( wp_unslash( $_POST['esfpx_es-subscribe'] ) ) : '';

			if ( ! empty( $es_subscribe ) && wp_verify_nonce( $es_subscribe, 'es-subscribe' ) ) {
				$nonce_verified = true;
			}

			if ( ! empty( $es_subscribe ) ) {
				defined( 'IG_ES_RETURN_HANDLE_RESPONSE' ) || define( 'IG_ES_RETURN_HANDLE_RESPONSE', true );
				
				// Check if this is a WYSIWYG form submission
				$form_id = ! empty( $_POST['esfpx_form_id'] ) ? (int) $_POST['esfpx_form_id'] : 0;
				if ( $form_id ) {
					$form = ES()->forms_db->get_form_by_id( $form_id );
					if ( $form ) {
						$settings = ! empty( $form['settings'] ) ? ig_es_maybe_unserialize( $form['settings'] ) : array();
						$editor_type = ! empty( $settings['editor_type'] ) ? $settings['editor_type'] : '';
						
						// If it's a WYSIWYG form, transform the data and use standard processor
						if ( 'wysiwyg' === $editor_type ) {
							$transformed_data = $this->transform_wysiwyg_form_data( wp_unslash( $_POST ), $form_id );
							$response = $this->process_request( $transformed_data );
							$response = $this->do_response( $response );
							wp_send_json( $response );
							return;
						}
					}
				}
				
				$response = $this->process_request( wp_unslash( $_POST ) );
			} else {
				$response = array( 'status' => 'ERROR', 'message' => 'es_unexpected_error_notice', );
			}
			$response = $this->do_response( $response );
			wp_send_json( $response );
		}

		/**
		 * Process request
		 *
		 * @param array $external_form_data data from external form/APIs.
		 *
		 * @since 4.0.0
		 *
		 * @modified 4.5.7 Added $external_form_data parameter.
		 * @modified 4.8.2 Added IG_ES_RETURN_HANDLE_RESPONSE const.
		 *
		 * @return void | array
		 */
		public function process_request( $external_form_data = array() ) {

			$response = array(
				'status'  => 'ERROR',
				'message' => '',
			);

			$es           = ! empty( $_POST['es'] ) ? sanitize_text_field( wp_unslash( $_POST['es'] ) ) : '';
			$es_form_id   = ! empty( $_POST['esfpx_form_id'] ) ? sanitize_text_field( wp_unslash( $_POST['esfpx_form_id'] ) ) : '';
			$es_subscribe = ! empty( $_POST['esfpx_es-subscribe'] ) ? sanitize_text_field( wp_unslash( $_POST['esfpx_es-subscribe'] ) ) : '';
			
			if ( ! empty( $es_subscribe ) && wp_verify_nonce( $es_subscribe, 'es-subscribe' ) ) {
				$nonce_verified = true;
			}

			$doing_ajax      = defined( 'DOING_AJAX' ) && DOING_AJAX;
			$return_response = defined( 'IG_ES_RETURN_HANDLE_RESPONSE' ) && IG_ES_RETURN_HANDLE_RESPONSE;

			if ( ( 'subscribe' === $es ) || ! empty( $external_form_data ) ) {

				if ( ! empty( $external_form_data ) ) {
					$form_data = $external_form_data;
				} else {
					$form_data = wp_unslash( $_POST );
				}
				$validate_response = $this->validate_data( $form_data );
				$validate_response = apply_filters( 'ig_es_validate_subscription', $validate_response, $form_data );

				if ( 'ERROR' === $validate_response['status'] ) {

					if ( 'es_email_address_blocked' === $validate_response['message'] ) {
						$validate_response['status']  = 'SUCCESS';
						$validate_response['message'] = 'es_optin_success_message';
					}

					$response = $this->do_response( $validate_response );
					if ( $return_response ) {
						return $response;
					} elseif ( $doing_ajax ) {
						wp_send_json( $response );
					} else {
						return $response;
					}
				}

				$email      = ! empty( $form_data['esfpx_email'] ) ? strtolower( sanitize_email( $form_data['esfpx_email'] ) ): '';
				$name       = ! empty( $form_data['esfpx_name'] ) ? str_replace( '.', ' ', sanitize_text_field( $form_data['esfpx_name'] ) ) : '';
				$ip_address = ! empty( $form_data['esfpx_ip_address'] ) ? sanitize_text_field( $form_data['esfpx_ip_address'] ) : '';

				// Security: Strip shortcode delimiters from subscriber name before storage.
				// Prevents shortcode injection via subscriber-controlled name fields.
				// See Wordfence advisory: Unauthenticated Arbitrary Shortcode Execution via Subscriber Name Field.
				if ( ! empty( $name ) ) {
					$name = wp_strip_all_tags( $name );
					$name = str_replace( array( '[', ']' ), '', $name );
				}

				$first_name = '';
				$last_name  = '';
				if ( ! empty( $name ) ) {
					$name_parts = ES_Common::prepare_first_name_last_name( $name );
					$first_name = $name_parts['first_name'];
					$last_name  = $name_parts['last_name'];
				}

				$this->name           = $first_name;
				$this->first_name     = $first_name;
				$this->last_name      = $last_name;
				$this->email          = $email;
				$this->ip_address     = $ip_address;
				$this->list_hashes    = isset( $form_data['esfpx_lists'] ) ? $form_data['esfpx_lists'] : array();
				$this->es_nonce       = isset( $form_data['esfpx_es-subscribe'] ) ? trim( $form_data['esfpx_es-subscribe'] ) : '';
				$this->form_id        = isset( $form_data['esfpx_form_id'] ) ? trim( $form_data['esfpx_form_id'] ) : 0;



			
				if ( ! empty( $this->form_id ) ) {
					$form = ES()->forms_db->get_form_by_id( $this->form_id );
					if ( $form && ! empty( $form['settings'] ) ) {
						$settings = ig_es_maybe_unserialize( $form['settings'] );
						
						$has_list_field = ! empty( $settings['has_list_field'] ) && 'yes' === $settings['has_list_field'];
						
						$backend_list_ids = array();
						if ( ! empty( $settings['lists'] ) && is_array( $settings['lists'] ) ) {
							$backend_list_ids = array_map( 'intval', $settings['lists'] );
						} elseif ( ! empty( $settings['lists'] ) && is_numeric( $settings['lists'] ) ) {
							$backend_list_ids = array( intval( $settings['lists'] ) );
						}
						
						if ( $has_list_field ) {
							if ( empty( $this->list_hashes ) ) {
								$this->list_hashes = array();
							}
						} else {
							if ( ! empty( $backend_list_ids ) ) {
								$backend_lists = ES()->lists_db->get_lists_by_id( $backend_list_ids );
								$backend_list_hashes = array();
								
								if ( ! empty( $backend_lists ) ) {
									foreach ( $backend_lists as $list ) {
										if ( ! empty( $list['hash'] ) ) {
											$backend_list_hashes[] = $list['hash'];
										}
									}
								}
								
								$this->list_hashes = $backend_list_hashes;
							} else {
								$this->list_hashes = array();
							}
						}
					} else {
						// No form settings found - fallback to existing behavior
					}
				} else {
					// No form ID provided - fallback to existing behavior
				}
				$this->reference_site = isset( $form_data['esfpx_reference_site'] ) ? esc_url_raw( $form_data['esfpx_reference_site'] ) : null;
				$this->es_optin_type  = get_option( 'ig_es_optin_type' );
				$this->guid           = ES_Common::generate_guid();

				if ( in_array( $this->es_optin_type, array( 'double_opt_in', 'double_optin' ) ) ) { // Backward Compatibility
					$this->is_double_optin = true;
					$this->status          = 'unconfirmed';
				} else {
					$this->status = 'subscribed';
				}

				if ( ! empty( $this->list_hashes ) ) {

					$list_hash_str  = ES()->lists_db->prepare_for_in_query( $this->list_hashes );
					$where          = "hash IN ($list_hash_str)";
					$this->list_ids = ES()->lists_db->get_column_by_condition( 'id', $where );

					if ( ! empty( $this->list_ids ) ) {

						$is_new = true;
						/**
						 * Check if subscribers exists?
						 *  - If yes, get id and save lists into ig_lists_contacts table
						 *  - If not, create contact and then save list
						 */
						$contact_id = ES()->contacts_db->get_contact_id_by_email( $this->email );
						if ( ! $contact_id ) {
							$data               = array();
							$data['first_name'] = $this->first_name;
							$data['last_name']  = $this->last_name;
							$data['source']     = 'form';
							$data['form_id']    = $this->form_id;
							$data['email']      = $this->email;
							$data['ip_address'] = $this->ip_address;
							$data['status']     = 'verified';
							$data['hash']       = $this->guid;
							$data['created_at'] = ig_get_current_date_time();
							$data['updated_at'] = null;
							$data['meta']       = null;

							if ( ! is_null( $this->reference_site ) ) {
								$data['reference_site'] = $this->reference_site;
							}

							$data = apply_filters( 'ig_es_add_subscriber_data', $data );

							$data = apply_filters( 'ig_es_add_custom_field_data' , $data, $form_data );
							if ( 'ERROR' === $data['status'] ) {
								$response = $this->do_response( $validate_response );
								if ( $return_response ) {
									return $response;
								} elseif ( $doing_ajax ) {
									wp_send_json( $response );
								} else {
									return $response;
								}
							}

							$contact_id = ES()->contacts_db->insert( $data );

							// do_action( 'ig_es_contact_added', $data);

						} else {
							$is_new = false;
						}

						$contact_lists = ES()->lists_contacts_db->get_list_ids_by_contact( $contact_id, 'subscribed' );
						if ( empty( array_diff( $this->list_ids, $contact_lists ) ) ) {
							$response['message'] = 'es_email_exists_notice';
							$response            = $this->do_response( $response );
							if ( $return_response ) {
								return $response;
							} elseif ( $doing_ajax ) {
								wp_send_json( $response );
							} else {
								return $response;
							}
						}

						// If contact already exists then update the contact data.
						if ( ! $is_new ) {
							$data = array();

							// Update first name and last name when both are provided
							if ( ! empty( $this->first_name ) && ! empty( $this->last_name ) ) {
								$data['first_name'] = $this->first_name;
								$data['last_name']  = $this->last_name;
							}

							if ( ! empty( $this->ip_address ) ) {
								$data['ip_address'] = $this->ip_address;
							}

							$data = apply_filters( 'ig_es_add_custom_field_data' , $data, $form_data );

							if ( ! empty( $data ) ) {
								$data['updated_at'] = ig_get_current_date_time();
								ES()->contacts_db->update( $contact_id, $data );
							}
						}

						$optin_type        = $this->is_double_optin ? IG_DOUBLE_OPTIN : IG_SINGLE_OPTIN;
						$list_contact_data = array(
							'contact_id'    => $contact_id,
							'status'        => $this->status,
							'subscribed_at' => ( 'subscribed' === $this->status ) ? ig_get_current_date_time() : '',
							'optin_type'    => $optin_type,
							'subscribed_ip' => '',
						);

						ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $this->list_ids );

						if ( $contact_id ) {

							do_action( 'ig_es_contact_subscribe', $contact_id, $this->list_ids );

							$this->db_id = $contact_id;

							// Get comma(,) separated lists name based on ids.
							$list_name = ES_Common::prepare_list_name_by_ids( $this->list_ids );

							$merge_tags = array(
								'email'      => $this->email,
								'contact_id' => $contact_id,
								'name'       => ES_Common::prepare_name_from_first_name_last_name( $this->first_name, $this->last_name ),
								'first_name' => $this->first_name,
								'last_name'  => $this->last_name,
								'guid'       => $this->guid,
								'list_name'  => $list_name,
								'list_ids'   => $this->list_ids,
							);

							if ( $this->is_double_optin ) {
								$response['message'] = 'es_optin_success_message';

								do_action( 'ig_es_contact_unconfirmed', $merge_tags );
							} else {

								do_action( 'ig_es_contact_subscribed', $merge_tags );

								// Send Notifications to admins
								//ES()->mailer->send_add_new_contact_notification_to_admins( $merge_tags );

								$response['message'] = 'es_optin_success_message';
							}

							$response['status']  = 'SUCCESS';
							$form_settings       = ES()->forms_db->get_form_settings( $es_form_id );
							$action_after_submit = ! empty( $form_settings['action_after_submit'] ) ? $form_settings['action_after_submit'] : '';

							if ( 'redirect_to_url' === $action_after_submit ) {
								$redirection_url             = ! empty( $form_settings['redirection_url'] ) ? $form_settings['redirection_url'] : '';
								$is_hash_not_added 		 	 = false === strpos( $redirection_url, '#' );
								$response['redirection_url'] = $is_hash_not_added ? $redirection_url . '#' : $redirection_url;
							}
						} else {

							$response['message'] = 'es_db_error_notice';
						}
					} else {
						$response['status']  = 'SUCCESS';
						$response['message'] = 'es_optin_success_message';							
						
						$response = $this->do_response( $response );
						if ( $return_response ) {
							return $response;
						} elseif ( $doing_ajax ) {
							wp_send_json( $response );
						} else {
							return $response;
						}
					}
				} else {
					$response['message'] = 'es_no_list_selected';
					$response            = $this->do_response( $response );
					if ( $return_response ) {
						return $response;
					} elseif ( $doing_ajax ) {
						wp_send_json( $response );
					} else {
						return $response;
					}
				}
			} else {
				$response['message'] = 'es_permission_denied_notice';				
			}

			$response = $this->do_response( $response );

			if ( $return_response ) {
				return $response;
			} elseif ( $doing_ajax ) {
				wp_send_json( $response );
			} else {
				if ( ! empty( $response['redirection_url'] ) && 'SUCCESS' === $response['status'] ) {
					wp_safe_redirect( $response['redirection_url'] );
					exit;
				}
				return $response;
			}
		}

		/**
		 * Send Response
		 *
		 * @param $response
		 *
		 * @since 4.0.0
		 * 
		 * @modify 5.6.1
		 */
		public function do_response( $response ) {

			$message                  = isset( $response['message'] ) ? $response['message'] : '';
			
			// Only set message_text if it's not already set (preserve form-specific messages)
			if ( empty( $response['message_text'] ) && ! empty( $message ) ) {
				$response['message_text'] = $this->get_messages( $message );
			}

			return $response;
		}

		/**
		 * Validate subscribers data
		 *
		 * @param $data
		 *
		 * @return array|mixed|void
		 *
		 * @since 4.0.0
		 * 
		 * @modify 5.6.7
		 */
		public function validate_data( $data ) {

			$es_response = array(
				'status'  => 'ERROR',
				'message' => '',
			);

			if ( ! $this->from_rainmaker ) {

				// Honeypot validation
				// $hp_key = "esfpx_es_hp" . wp_create_nonce( 'es_hp' );
				$hp_key = 'esfpx_es_hp_email';
				if ( ! isset( $data[ $hp_key ] ) || ! empty( $data[ $hp_key ] ) ) {
					$es_response['message'] = 'es_unexpected_error_notice';

					return $es_response;
				}
			}

			$name = isset( $data['esfpx_name'] ) ? $data['esfpx_name'] : '';
			if ( strlen( $name ) > 50 ) {
				$es_response['message'] = 'es_invalid_name_notice';

				return $es_response;
			}

			$email = isset( $data['esfpx_email'] ) ? $data['esfpx_email'] : '';

			if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
				$es_response['message'] = 'es_invalid_email_notice';

				return $es_response;
			}

			$is_domain_blocked = ES_Common::is_domain_blocked( $email );

			// Store it blocked emails
			if ( $is_domain_blocked ) {
				$data = array(
					'email' => $email,
					'ip'    => ig_es_get_ip(),
				);

				ES()->blocked_emails_db->insert( $data );

				$es_response['status']  = 'ERROR';
				$es_response['message'] = 'es_email_address_blocked';

				return $es_response;
			}

			$data = apply_filters( 'ig_es_validate_subscribers_data', $data );

			if ( ! empty( $data['status'] ) && 'ERROR' === $data['status'] ) {
				$es_response = $data;

				return $es_response;
			}

			$timeout = ES_Subscription_Throttling::throttle();
			if ( $timeout > 0 ) {
				$es_response['message'] = 'es_rate_limit_notice';

				return $es_response;
			}

			$es_response['status'] = 'SUCCESS';

			return $es_response;
		}

		/**
		 * Transform WYSIWYG form data to standard format
		 * 
		 * @param array $form_data Original form data
		 * @param int $form_id Form ID
		 * 
		 * @return array Transformed form data
		 * 
		 * @since 5.8.0
		 */
		private function transform_wysiwyg_form_data( $form_data, $form_id ) {
			$transformed_data = $form_data;
			
			// Ensure required fields
			if ( empty( $transformed_data['esfpx_es_hp_email'] ) ) {
				$transformed_data['esfpx_es_hp_email'] = '';
			}
			
			if ( empty( $transformed_data['es'] ) ) {
				$transformed_data['es'] = 'subscribe';
			}
			
			// Get form settings for success message handling
			$form = ES()->forms_db->get_form_by_id( $form_id );
			if ( $form ) {
				$settings = ! empty( $form['settings'] ) ? ig_es_maybe_unserialize( $form['settings'] ) : array();
				
				// Store form-specific success message for later use
				if ( ! empty( $settings['success_message'] ) ) {
					$transformed_data['_wysiwyg_success_message'] = $settings['success_message'];
				}
			}
			
			return $transformed_data;
		}
				
		/**
		 * Get Message description based on message
		 *
		 * @param $message
		 *
		 * @return array|mixed|string|void
		 *
		 * @since 4.0.0
		 * 
		 * @modify 5.6.1
		 */
		public function get_messages( $message ) {
			$ig_es_form_submission_success_message = get_option( 'ig_es_form_submission_success_message' );
			$form_data 							   = ES()->forms_db->get_form_by_id( $this->form_id );
			$success_message 					   = ''; // Initialize to empty string
			
			if ( ! empty( $form_data['settings'] ) ) {
				$settings        = ig_es_maybe_unserialize( $form_data['settings'] );
				$success_message = ! empty( $settings['success_message'] ) ? $settings['success_message'] : '';
			}

			$messages                              = array(
				'es_empty_email_notice'       => __( 'Please enter email address', 'email-subscribers' ),
				'es_rate_limit_notice'        => __( 'You need to wait for some time before subscribing again', 'email-subscribers' ),
				'es_optin_success_message'    => ! empty( $success_message ) ? $success_message : $ig_es_form_submission_success_message,
				'es_email_exists_notice'      => __( 'Email Address already exists!', 'email-subscribers' ),
				'es_unexpected_error_notice'  => __( 'Oops.. Unexpected error occurred.', 'email-subscribers' ),
				'es_invalid_email_notice'     => __( 'Invalid email address', 'email-subscribers' ),
				'es_invalid_name_notice'      => __( 'Invalid name', 'email-subscribers' ),
				'es_try_later_notice'         => __( 'Please try after some time', 'email-subscribers' ),
				'es_db_error_notice'          => __( 'Oops...unable to add subscriber', 'email-subscribers' ),
				'es_permission_denied_notice' => __( 'You do not have permission to add subscriber', 'email-subscribers' ),
				'es_no_list_selected'         => __( 'Please select the list', 'email-subscribers' ),
				'es_invalid_captcha'          => __( 'Invalid Captcha', 'email-subscribers' ),
			);
			
			$messages = apply_filters( 'ig_es_subscription_messages', $messages );

			if ( ! empty( $messages ) ) {
				return isset( $messages[ $message ] ) ? $messages[ $message ] : '';
			}

			return $messages;
		}

		/**
		 * Method to handle external subscriptions.
		 *
		 * @since 4.4.7
		 * 
		 * @modify 5.6.2
		 **/
		public function handle_subscription() {

			$external_action = ig_es_get_request_data( 'ig_es_external_action' );
			if ( ! empty( $external_action ) && 'subscribe' === $external_action ) {
				$subscription_api_enabled = 'yes' === get_option( 'ig_es_allow_api', 'yes' );
				if ( ! $subscription_api_enabled ) {
					return;
				}
				$list_hash  = ig_es_get_request_data( 'list' );
				$lists_hash = ig_es_get_request_data( 'lists' );
				if ( ! empty( $list_hash ) ) {
					$list  = ES()->lists_db->get_by( 'hash', $list_hash );
					$lists = array( $list );
					$lists_hash = array( $list_hash );
				} elseif ( ! empty( $lists_hash ) ) {
					$lists = ES()->lists_db->get_lists_by_hash( $lists_hash );
				}

				if ( ! empty( $lists ) ) {
					$name       = ig_es_get_request_data( 'name' );
					$email      = ig_es_get_request_data( 'email' );
					$hp_email   = ig_es_get_request_data( 'es_hp_email' );
					$ip_address = ig_es_get_request_data( 'ip_address' );

					$form_data = array(
						'esfpx_name'        => $name,
						'esfpx_email'       => $email,
						'esfpx_es_hp_email' => $hp_email,
						'esfpx_ip_address'  => $ip_address,
						'esfpx_lists'       => $lists_hash,
						'form_type'         => 'external',
					);
					$response = $this->process_request( $form_data );
					wp_send_json( $response );
				}
			}

			$doing_ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;
			// Run only when it is normal form submission and not ajax form submission.
			if ( ! $doing_ajax ) {
				$es_action = ig_es_get_post_data( 'es' );				
				if ( ! empty( $es_action ) && 'subscribe' === $es_action ) {
					// Check if this is a WYSIWYG form submission
					$form_id = ig_es_get_post_data( 'esfpx_form_id' );
					if ( ! empty( $form_id ) ) {
						$form = ES()->forms_db->get_form_by_id( $form_id );
						if ( $form ) {
							$settings = ! empty( $form['settings'] ) ? ig_es_maybe_unserialize( $form['settings'] ) : array();
							$editor_type = ! empty( $settings['editor_type'] ) ? $settings['editor_type'] : '';
							
							// If it's a WYSIWYG form, transform the data and use standard processor
							if ( 'wysiwyg' === $editor_type ) {
								$transformed_data = $this->transform_wysiwyg_form_data( wp_unslash( $_POST ), $form_id );
								$response = $this->process_request( $transformed_data );
								if ( ! empty( $response['redirection_url'] ) ) {
									wp_redirect( $response['redirection_url'] );
									exit;
								}
								ES_Shortcode::$response = $response;
								return;
							}
						}
					}
					
				// Store the response, so that it can be shown while outputting the subscription form HTML.
				$response = $this->process_request();
					if ( ! empty( $response['redirection_url'] ) ) {
						wp_redirect( $response['redirection_url'] );
						exit;
					}					ES_Shortcode::$response = $response;
				}
			}
		}

	}
}
