<?php
/*
 * Jetpack CRM
 * https://jetpackcrm.com
 *
 * MailPoet Sync: Export CRM segment to MailPoet list class
 */
namespace Automattic\JetpackCRM;

// block direct access
defined( 'ZEROBSCRM_PATH' ) || exit( 0 );

/**
 * Export CRM segment to MailPoet list class
 */
class Mailpoet_Export_Segment_To_MailPoet {

	/**
	 * The single instance of the class.
	 */
	protected static $_instance = null;

	/**
	 * Setup Mailpoet_Export_Segment_To_MailPoet
	 */
	public function __construct() {

		// Initialise Hooks
		$this->init_hooks();
	}

	/**
	 * Main Class Instance.
	 *
	 * Ensures only one instance of Mailpoet_Export_Segment_To_MailPoet is loaded or can be loaded.
	 *
	 * @since 2.0
	 * @static
	 * @see
	 * @return Mailpoet_Admin_Integration main instance
	 */
	public static function instance() {
		if ( self::$_instance === null ) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}

	/**
	 * Initialise Hooks
	 */
	private function init_hooks() {

		add_action(
			'jpcrm_segment_edit_export_mailpoet_button',
			function () {
				// AJAX call to action 'jpcrm_segment_export_to_mailpoet'
				?>
			<button class="ui submit black large icon button zbs-segment-export-mailpoet">
				<?php esc_html_e( 'Export to MailPoet', 'zero-bs-crm' ); ?> <i class="mail forward icon"></i>
			</button>
				<?php
			}
		);

		// enqueue our listview script additions
		add_action(
			'jpcrm_enqueue_styles_listview',
			function () {

				global $zbs;
				wp_enqueue_script( 'jpcrm-mailpoet-listview', plugins_url( '/js/jpcrm-mailpoet-listview-additions' . wp_scripts_get_suffix() . '.js', JPCRM_MAILPOET_ROOT_FILE ), array( 'jquery' ), $zbs::VERSION ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter
			}
		);

		// hook into zbs_root.lang to add lang labels on our page
		add_filter(
			'zbs_globaljs_lang',
			function ( $language_labels = array() ) {

				global $zbs, $pagenow;

				// only on our page
				if ( zeroBS_hasGETParamsWithValues(
					array( 'admin.php' ),
					array(
						'page'    => $zbs->slugs['addedit'],
						'zbstype' => 'segment',
					)
				) ) {

					$language_labels['mailpoet_list_exists']        = __( 'Previously Exported', 'zero-bs-crm' );
					$language_labels['mailpoet_list_exists_detail'] = __( 'This segment was previously exported to MailPoet. Are you sure you want to export it again?<br>(Doing so will overwrite the existing MailPoet List.)', 'zero-bs-crm' );
					$language_labels['continue_export']             = __( 'Start Export', 'zero-bs-crm' );

				}

				return $language_labels;
			}
		);

		add_action(
			'segment_edit_extra_js',
			function () {

				// JS to initiate export when window param passed
				?>

				// Export segment as MailPoet list.
				jQuery( '.zbs-segment-export-mailpoet' ).off( 'click' ).on( 'click', function ( e ) {
					let exportButton = jQuery( e.target );
					jpcrm_segment_export_to_mailpoet( exportButton );
				});

				// Check if mailpoet_export URL param is present, and start auto-export.
				let searchParams = new URLSearchParams(window.location.search);
				if ( searchParams.has('mailpoet_export') ) {
					jQuery( '.zbs-segment-export-mailpoet' ).click();
				}

				<?php
			}
		);

		/**
		 * AJAX endpoint to kick off export from Segments to MailPoet
		 * This function only returns the total count of contacts that will
		 * be created as subscribers. Another AJAX request will POST-batch them
		 */
		add_action(
			'wp_ajax_jpcrm_mailpoet_export_kick_off',
			function () {

				// Check nonce
				check_ajax_referer( 'zbs-ajax-nonce', 'sec' );

				if ( current_user_can( 'admin_zerobs_customers' ) ) {
					global $zbs;

					$segment_id = -1;
					if ( isset( $_POST['segment_id'] ) ) {
						$segment_id = (int) $_POST['segment_id'];
					}

					try {

						$retrieve_fields  = array( 'email' );
						$segment_contacts = $zbs->DAL->segments->getSegmentAudience( $segment_id, 0, 100000, 'ID', 'DESC', false, false, $retrieve_fields );

						$segment = $zbs->DAL->segments->getSegment( $segment_id );

						if ( ! empty( $segment ) && is_array( $segment_contacts ) ) {

							$valid_emails = array_filter(
								$segment_contacts,
								function ( $sc ) {
									return zeroBSCRM_validateEmail( $sc['email'] );
								}
							);

							$count_valid_emails = count( $valid_emails );
							$extra_message      = '';
							if ( $count_valid_emails > 500 ) {
								$extra_message = __( 'This might take a while.', 'zero-bs-crm' );
							}

							$list_name = $this->get_export_list_name( $segment['name'] );
							$list_id   = $zbs->modules->mailpoet->reset_mailpoet_list_by_segment_name( $list_name );

							if ( ! empty( $list_id ) ) {
								wp_send_json(
									array(
										'jpcrm_segment_ID' => $segment_id,
										'mailpoet_list_ID' => $list_id,
										'success'          => true,
										'total_contacts'   => $count_valid_emails,
										'lang'             => array(
											'export_in_progress' => __( 'Export in progress', 'zero-bs-crm' ),
											'export_finished' => __( 'Export finished', 'zero-bs-crm' ),
											'export_in_progress_long' => __( 'This Segment is being exported to a MailPoet List.', 'zero-bs-crm' ) . ' ' . $extra_message,
											'export_finished_long' => __( 'The export process is now complete. Click the button below to view the list of subscribers.', 'zero-bs-crm' ),
											'go_to_mailpoet_list' => __( 'Go to MailPoet', 'zero-bs-crm' ),
										),
									),
									200,
									JSON_UNESCAPED_SLASHES
								);
							}
						}
					} catch ( \Throwable $th ) {
						wp_send_json(
							array(
								'success' => false,
								'lang'    => array(
									'error_title'   => __( 'Something went wrong', 'zero-bs-crm' ),
									'error_message' => $th->getMessage(),
								),
							),
							200,
							JSON_UNESCAPED_SLASHES
						);
					}
				}

				// empty handed
				wp_send_json(
					array(
						'segmentID' => $segment_id,
						'success'   => false,
						'lang'      => array(
							'error_title'   => __( 'Something went wrong', 'zero-bs-crm' ),
							'error_message' => __( 'The segment could not be exported to MailPoet', 'zero-bs-crm' ),
						),
					),
					200,
					JSON_UNESCAPED_SLASHES
				);
			}
		);

		/**
		 * AJAX endpoint to export to MailPoet Segment, by batch
		 */
		add_action(
			'wp_ajax_jpcrm_mailpoet_export_segment',
			function () {

				header( 'Content-Type: application/json' );

				global $zbs;

				try {

					if ( ! current_user_can( 'admin_zerobs_customers' ) ) {
						echo esc_html__( 'Not enough permissions.', 'zero-bs-crm' );
						exit( 0 );
					}

					if ( ! isset( $_POST['segment_id'] ) || ! isset( $_POST['mailpoet_id'] ) ) {
						echo esc_html__( 'Not enough data provided to perform export.', 'zero-bs-crm' );
						exit( 0 );
					}

					$segment_id  = (int) sanitize_text_field( $_POST['segment_id'] );
					$mailpoet_id = (int) sanitize_text_field( $_POST['mailpoet_id'] );
					$page        = (int) sanitize_text_field( $_POST['page'] );
					$per_page    = (int) sanitize_text_field( $_POST['per_page'] );

					$retrieve_fields = $retrieve_fields = array( 'email', 'fname', 'lname' );
					$contacts_batch  = $zbs->DAL->segments->getSegmentAudience( $segment_id, $page, $per_page, 'ID', 'DESC', false, false, $retrieve_fields );

					// Create MailPoet Mailing List
					$response = $zbs->modules->mailpoet->contacts_to_subscribers( $mailpoet_id, $contacts_batch );

					if ( ! empty( $response['success'] ) ) {

						$is_last_batch = ( count( $contacts_batch ) < $per_page );

						wp_send_json(
							array(
								'success'       => true,
								'segmentID'     => $segment_id,
								'current_page'  => $page,
								'is_last_batch' => $is_last_batch,
							),
							200,
							JSON_UNESCAPED_SLASHES
						);

					} else {

						wp_send_json(
							array(
								'segmentID' => $segment_id,
								'success'   => false,
								'error'     => $response['error'],
								'lang'      => array(
									'error_title'   => __( 'Something went wrong', 'zero-bs-crm' ),
									'error_message' => __( 'The segment could not be exported to MailPoet', 'zero-bs-crm' ),
								),
							),
							200,
							JSON_UNESCAPED_SLASHES
						);

					}
				} catch ( \Throwable $th ) {

								wp_send_json(
									array(
										'segmentID' => $segment_id,
										'success'   => false,
										'error'     => $th->getMessage(),
										'lang'      => array(
											'error_title' => __( 'Something went wrong', 'zero-bs-crm' ),
											'error_message' => __( 'The segment could not be exported to MailPoet', 'zero-bs-crm' ),
										),
									),
									200,
									JSON_UNESCAPED_SLASHES
								);

				}
			}
		);

		/**
		 * AJAX endpoint to retrieve summary data about a mailpoet list
		 */
		add_action(
			'wp_ajax_jpcrm_mailpoet_retrieve_list_summary',
			function () {

				header( 'Content-Type: application/json' );

				global $zbs;

				try {

					if ( ! current_user_can( 'admin_zerobs_customers' ) ) {
						echo esc_html__( 'Not enough permissions.', 'zero-bs-crm' );
						exit( 0 );
					}

					if ( ! isset( $_POST['list_name'] ) ) {
						echo esc_html__( 'Not enough data provided to perform export.', 'zero-bs-crm' );
						exit( 0 );
					}

					$list_name   = sanitize_text_field( $_POST['list_name'] );
					$list_suffix = (int) sanitize_text_field( $_POST['add_suffix'] );

					// add ` | CRM`?
					if ( $list_suffix ) {
						$list_name = $this->get_export_list_name( $list_name );
					}

					$list_details = $zbs->modules->mailpoet->get_mailpoet_list_summary_by_name( $list_name );

					if ( ! is_array( $list_details ) ) {
						// nope
						wp_send_json( false, 200, JSON_UNESCAPED_SLASHES );
					} else {
						// success
						wp_send_json( $list_details, 200, JSON_UNESCAPED_SLASHES );
					}
				} catch ( \Throwable $th ) {
					wp_send_json_error( array( 'fail' => 1 ), 500, JSON_UNESCAPED_SLASHES );
				}
			}
		);
	}

	/**
	 * Returns the name that a segment would be exported to
	 */
	public function get_export_list_name( $list_name = '' ) {

		$name = $list_name . ' | CRM';
		##WLREMOVE
		$name = $list_name . ' | Jetpack CRM';
		##/WLREMOVE

		return $name;
	}
}
