<?php
/**
 * CartFlows Flows ajax actions.
 *
 * @package CartFlows
 */

namespace CartflowsAdmin\AdminCore\Ajax;

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

use CartflowsAdmin\AdminCore\Ajax\AjaxBase;
use CartflowsAdmin\AdminCore\Inc\AdminHelper;
use CartflowsAdmin\AdminCore\Inc\MetaOps;

/**
 * Class Flows.
 */
class Flows extends AjaxBase {

	/**
	 * Instance
	 *
	 * @access private
	 * @var object Class object.
	 * @since 1.0.0
	 */
	private static $instance;

	/**
	 * Initiator
	 *
	 * @since 1.0.0
	 * @return object initialized object of class.
	 */
	public static function get_instance() {
		if ( ! isset( self::$instance ) ) {
			self::$instance = new self();
		}
		return self::$instance;
	}

	/**
	 * Register ajax events.
	 *
	 * @since 1.0.0
	 * @return void
	 */
	public function register_ajax_events() {

		$ajax_events = array(
			'update_flow_title',
			'clone_flow',
			'delete_flow',
			'trash_flow',
			'restore_flow',
			'reorder_flow_steps',
			'trash_flows_in_bulk',
			'update_flow_post_status',
			'delete_flows_permanently',
			'save_flow_meta_settings',
			'export_flows_in_bulk',
			'update_status',
			'update_store_checkout_status',
			'hide_instant_checkout_notice',
			'get_published_flows',
		);

		$this->init_ajax_events( $ajax_events );
	}

	/**
	 * Export the flows and it's data.
	 */
	public function export_flows_in_bulk() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_export_flows_in_bulk', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		if ( ! isset( $_POST['flow_ids'] ) ) {
			$response_data = array( 'message' => __( 'No Funnel IDs has been supplied to export!', 'cartflows' ) );
			wp_send_json_error( $response_data );
		}

		$flow_ids = array_map( 'intval', explode( ',', sanitize_text_field( $_POST['flow_ids'] ) ) );

		$flows  = array();
		$export = \CartFlows_Importer::get_instance();
		foreach ( $flow_ids as $key => $flow_id ) {
			$flows[] = $export->get_flow_export_data( $flow_id );
		}

		$response_data = array(
			'message' => __( 'Funnel exported successfully', 'cartflows' ),
			'flows'   => wp_json_encode( $flows ),
		);

		wp_send_json_success( $response_data );
	}

	/**
	 * Save flow meta data.
	 */
	public function save_flow_meta_settings() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_save_flow_meta_settings', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$response_data = array(
			'status' => false,
			'text'   => __( 'Can\'t update the flow data', 'cartflows' ),
		);

		if ( isset( $_POST['flow_id'] ) ) {
			$flow_id = intval( $_POST['flow_id'] );

			if ( empty( $flow_id ) ) {
				wp_send_json_error( $response_data );
			}

			if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
				wp_send_json_error( $response_data );
			}

			$new_flow_title = isset( $_POST['post_title'] ) ? sanitize_text_field( wp_unslash( $_POST['post_title'] ) ) : get_the_title( $flow_id );

			if ( '' === $new_flow_title ) {
				$new_flow_title = __( '(no title)', 'cartflows' );
			}

			$new_flow_slug = isset( $_POST['post_name'] ) ? sanitize_text_field( wp_unslash( $_POST['post_name'] ) ) : '';

			$post_meta = wcf()->options->get_flow_fields( $flow_id );
			MetaOps::save_meta_fields( $flow_id, $post_meta, 'cartflows_save_flow_meta_settings' );

			$instant_layout_style = isset( $_POST['instant-layout-style'] ) ? sanitize_text_field( wp_unslash( $_POST['instant-layout-style'] ) ) : null;
		
			if ( 'yes' === $instant_layout_style ) {
				update_post_meta( $flow_id, 'wcf-instant-checkout-notice-skipped', 'yes' );
				update_option( 'wcf-instant-checkout-notice-skipped', 'yes' );
				\Cartflows_Helper::set_analytics_flag( 'first_instant_layout_enabled' );
			}

			$new_flow_data = array(
				'ID'         => $flow_id,
				'post_title' => $new_flow_title,
				'post_name'  => $new_flow_slug,
			);

			wp_update_post( $new_flow_data );
		}

		$response_data = array(
			'message' => __( 'Successfully saved the flow data!', 'cartflows' ),
		);
		wp_send_json_success( $response_data );
	}

	/**
	 * Delete the flow and it's data.
	 */
	public function delete_flows_permanently() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_delete_flows_permanently', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$flow_ids = isset( $_POST['flow_ids'] ) ? array_map( 'intval', explode( ',', sanitize_text_field( $_POST['flow_ids'] ) ) ) : array();

		foreach ( $flow_ids as $key => $flow_id ) {

			/* Check if CartFlows Post type */
			if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
				continue;
			}

			/* Get Steps */
			$steps = get_post_meta( $flow_id, 'wcf-steps', true );

			/* delte All steps */
			if ( $steps && is_array( $steps ) ) {
				foreach ( $steps as $step ) {

					/* Need to delete ab test data as well */
					wp_delete_post( $step['id'], true );
				}
			}
			/* Trash term */
			$term_data = term_exists( 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );

			if ( is_array( $term_data ) ) {
				wp_trash_post( $term_data['term_id'], CARTFLOWS_TAXONOMY_STEP_FLOW );
			}

			/* Finally trash flow post and it's data */
				wp_delete_post( $flow_id, true );
		}

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message' => __( 'Successfully deleted the Funnels!', 'cartflows' ),
		);
		wp_send_json_success( $response_data );
	}

	/**
	 * Update flow status.
	 */
	public function update_flow_post_status() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_update_flow_post_status', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		if ( ! isset( $_POST['flow_ids'] ) ) {
			$response_data = array( 'message' => __( 'No Funnel IDs has been supplied to delete!', 'cartflows' ) );
			wp_send_json_error( $response_data );
		}

		$flow_ids = isset( $_POST['flow_ids'] ) ? array_map( 'intval', explode( ',', sanitize_text_field( $_POST['flow_ids'] ) ) ) : array();

		$new_status       = isset( $_POST['new_status'] ) ? sanitize_text_field( wp_unslash( $_POST['new_status'] ) ) : '';
		$allowed_statuses = array( 'publish', 'draft', 'trash', 'pending' );
		if ( ! in_array( $new_status, $allowed_statuses, true ) ) {
			wp_send_json_error( array( 'message' => __( 'Invalid post status.', 'cartflows' ) ) );
		}

		foreach ( $flow_ids as $key => $flow_id ) {

			/* Check if CartFlows Post type */
			if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
				continue;
			}

			/* Get Steps */
			$steps = get_post_meta( $flow_id, 'wcf-steps', true );

			/* Trash All steps */
			if ( $steps && is_array( $steps ) ) {
				foreach ( $steps as $step ) {

					$my_post                = array();
					$my_post['ID']          = $step['id'];
					$my_post['post_status'] = $new_status;
					wp_update_post( wp_slash( $my_post ) );

				}
			}

			/*
			Trash term
				// $term_data = term_exists( 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );
				// if ( is_array( $term_data ) ) {
				// wp_trash_post( $term_data['term_id'], CARTFLOWS_TAXONOMY_STEP_FLOW );
				// }
			*/

			/* Finally trash flow post and it's data */
			$flow_post                = array();
			$flow_post['ID']          = $flow_id;
			$flow_post['post_status'] = $new_status;
			wp_update_post( $flow_post );
		}

		$flow_count = count( $flow_ids );

		switch ( $new_status ) {
			case 'publish':
				$success_message = _n(
					'Successfully published the Funnel!',
					'Successfully published the Funnels!',
					$flow_count,
					'cartflows'
				);
				break;
			case 'draft':
				$success_message = _n(
					'Successfully moved the Funnel to draft!',
					'Successfully moved the Funnels to draft!',
					$flow_count,
					'cartflows'
				);
				break;
			case 'trash':
				$success_message = _n(
					'Successfully trashed the Funnel!',
					'Successfully trashed the Funnels!',
					$flow_count,
					'cartflows'
				);
				break;
			case 'pending':
				$success_message = _n(
					'Successfully marked the Funnel as pending!',
					'Successfully marked the Funnels as pending!',
					$flow_count,
					'cartflows'
				);
				break;
			default:
				$success_message = __( 'Successfully updated the Funnel status!', 'cartflows' );
				break;
		}

		$response_data = array(
			'message' => $success_message,
		);
		wp_send_json_success( $response_data );
	}


	/**
	 * Trash the flows and it's data.
	 */
	public function trash_flows_in_bulk() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_trash_flows_in_bulk', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		if ( ! isset( $_POST['flow_ids'] ) ) {
			$response_data = array( 'message' => __( 'No Funnel IDs has been supplied to delete!', 'cartflows' ) );
			wp_send_json_error( $response_data );
		}

		$flow_ids = isset( $_POST['flow_ids'] ) ? array_map( 'intval', explode( ',', sanitize_text_field( $_POST['flow_ids'] ) ) ) : array();

		foreach ( $flow_ids as $key => $flow_id ) {

			/* Check if CartFlows Post type */
			if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
				continue;
			}
			/* Get Steps */
			$steps = get_post_meta( $flow_id, 'wcf-steps', true );

			/* Trash All steps */
			if ( $steps && is_array( $steps ) ) {
				foreach ( $steps as $step ) {

					/* Need to delete ab test data as well */
					wp_trash_post( $step['id'], true );
				}
			}

			/* Trash term */
			$term_data = term_exists( 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );

			if ( is_array( $term_data ) ) {
				wp_trash_post( $term_data['term_id'], CARTFLOWS_TAXONOMY_STEP_FLOW );
			}

			/* Finally trash flow post and it's data */
			wp_trash_post( $flow_id, true );
		}

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message' => __( 'Successfully trashed the Funnels!', 'cartflows' ),
		);
		wp_send_json_success( $response_data );
	}
	/**
	 * Update flow title.
	 */
	public function update_flow_title() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_update_flow_title', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$flow_id        = isset( $_POST['flow_id'] ) ? intval( $_POST['flow_id'] ) : 0;
		$new_flow_title = isset( $_POST['new_flow_title'] ) ? sanitize_text_field( $_POST['new_flow_title'] ) : '';

		/* Check if CartFlows Post type */
		if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
			wp_send_json_error( array( 'message' => __( 'Invalid Funnel ID has been supplied to update title.', 'cartflows' ) ) );
		}

		$result = array(
			'status' => false,
			'text'   => __( 'Can\'t update the flow title', 'cartflows' ),
		);

		if ( empty( $flow_id ) || empty( $new_flow_title ) ) {
			wp_send_json( $result );
		}

		$new_flow_data = array(
			'ID'         => $flow_id,
			'post_title' => $new_flow_title,
		);
		wp_update_post( $new_flow_data );

		$result = array(
			'status' => true,
			/* translators: %s flow id */
			'text'   => sprintf( __( 'Funnel title updated - %s', 'cartflows' ), $flow_id ),
		);

		wp_send_json( $result );
	}

	/**
	 * Clone the Flow.
	 */
	public function clone_flow() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_clone_flow', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$response_data = array( 'message' => __( 'Invalid Funnel ID has been supplied to clone!', 'cartflows' ) );

		/**
		 * Check flow id
		 */
		if ( empty( $_POST['id'] ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Get the original post id
		 */
		$post_id = absint( $_POST['id'] );

		/* Check if CartFlows Post type */
		if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $post_id ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * And all the original post data then
		 */
		$post = get_post( $post_id );

		/**
		 * Assign current user to be the new post author
		 */
		$current_user    = wp_get_current_user();
		$new_post_author = $current_user->ID;

		/**
		 * If post data not exists, throw error
		 */
		if ( ! isset( $post ) || null === $post ) {
			$response_data = array( 'message' => __( 'Invalid Funnel ID has been supplied to duplicate!', 'cartflows' ) );
			wp_send_json_error( $response_data );
		}

		global $wpdb;

		/**
		 * Let's start cloning
		 */

		/**
		 * New post data array
		 */
		$args = array(
			'comment_status' => $post->comment_status,
			'ping_status'    => $post->ping_status,
			'post_author'    => $new_post_author,
			'post_content'   => $post->post_content,
			'post_excerpt'   => $post->post_excerpt,
			'post_name'      => $post->post_name,
			'post_parent'    => $post->post_parent,
			'post_password'  => $post->post_password,
			'post_status'    => $post->post_status,
			'post_title'     => $post->post_title . ' Clone',
			'post_type'      => $post->post_type,
			'to_ping'        => $post->to_ping,
			'menu_order'     => $post->menu_order,
		);

		/**
		 * Insert the post
		 */
		$new_flow_id = wp_insert_post( $args );

		/**
		 * Get all current post terms ad set them to the new post
		 *
		 * Returns array of taxonomy names for post type, ex array("category", "post_tag");.
		 */
		$taxonomies = get_object_taxonomies( $post->post_type );

		foreach ( $taxonomies as $taxonomy ) {

			$post_terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );

			wp_set_object_terms( $new_flow_id, $post_terms, $taxonomy, false );
		}

		/**
		 * Duplicate all post meta just in two SQL queries
		 */
		// Using custom query to clone flow & step meta data as it is better than WP functions in case in large data.
		$post_meta_infos = $wpdb->get_results( //phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$wpdb->prepare( "SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=%d", $post_id )
		);

		if ( ! empty( $post_meta_infos ) ) {

			$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) VALUES ";

			$sql_query_sel = array();

			foreach ( $post_meta_infos as $meta_info ) {

				$meta_key = $meta_info->meta_key;

				if ( '_wp_old_slug' === $meta_key ) {
					continue;
				}

				$sql_query_sel[] = $wpdb->prepare( '( %d, %s, %s )', $new_flow_id, $meta_key, $meta_info->meta_value );

			}

			$sql_query .= implode( ',', $sql_query_sel );

			$wpdb->query( $sql_query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery
		}

		/* Steps Cloning */
		$flow_steps     = get_post_meta( $post_id, 'wcf-steps', true );
		$new_flow_steps = array();

		/* Set Steps Empty */
		update_post_meta( $new_flow_id, 'wcf-steps', $new_flow_steps );

		if ( is_array( $flow_steps ) && ! empty( $flow_steps ) ) {

			foreach ( $flow_steps as $index => $step_data ) {

				$step_id   = $step_data['id'];
				$step_type = get_post_meta( $step_id, 'wcf-step-type', true );

				$step_object = get_post( $step_id );

				/**
				 * New step post data array
				 */
				$step_args = array(
					'comment_status' => $step_object->comment_status,
					'ping_status'    => $step_object->ping_status,
					'post_author'    => $new_post_author,
					'post_content'   => $step_object->post_content,
					'post_excerpt'   => $step_object->post_excerpt,
					'post_name'      => $step_object->post_name,
					'post_parent'    => $step_object->post_parent,
					'post_password'  => $step_object->post_password,
					'post_status'    => $step_object->post_status,
					'post_title'     => $step_object->post_title,
					'post_type'      => $step_object->post_type,
					'to_ping'        => $step_object->to_ping,
					'menu_order'     => $step_object->menu_order,
				);

				/**
				 * Insert the post
				 */
				$new_step_id = wp_insert_post( $step_args );

				/**
				 * Duplicate all step meta
				 */
				$post_meta_infos = $wpdb->get_results( //phpcs:ignore WordPress.DB.DirectDatabaseQuery
					$wpdb->prepare( "SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=%d", $step_id )
				);

				if ( ! empty( $post_meta_infos ) ) {

					$sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) VALUES ";

					$sql_query_sel = array();

					foreach ( $post_meta_infos as $meta_info ) {

						$meta_key = $meta_info->meta_key;

						$meta_value = $meta_info->meta_value;

						$sql_query_sel[] = $wpdb->prepare( '( %d, %s, %s )', $new_step_id, $meta_key, $meta_value );
					}

					$sql_query .= implode( ',', $sql_query_sel );

					$wpdb->query( $sql_query ); //phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery
				}

				// insert post meta.
				update_post_meta( $new_step_id, 'wcf-flow-id', $new_flow_id );
				update_post_meta( $new_step_id, 'wcf-step-type', $step_type );

				/**
				 * @ to_do later
				 * delete split test connecctivity
				 */

				wp_set_object_terms( $new_step_id, $step_type, CARTFLOWS_TAXONOMY_STEP_TYPE );
				wp_set_object_terms( $new_step_id, 'flow-' . $new_flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );

				/* Add New Flow Steps */
				$new_flow_steps[] = array(
					'id'    => $new_step_id,
					'title' => $step_object->post_title,
					'type'  => $step_type,
				);
			}
		}

		/* Update New Flow Step Post Meta */
		update_post_meta( $new_flow_id, 'wcf-steps', $new_flow_steps );

		/* Clear Page Builder Cache */
		AdminHelper::clear_cache();

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message'      => __( 'Successfully cloned the Funnel!', 'cartflows' ),
			'redirect_url' => admin_url( 'post.php?action=edit&post=' . $new_flow_id ),
		);
		wp_send_json_success( $response_data );
	}

	/**
	 * Restore the flow and it's data.
	 */
	public function restore_flow() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_restore_flow', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$response_data = array( 'message' => __( 'Invalid Funnel ID has been supplied to restore!', 'cartflows' ) );


		if ( ! isset( $_POST['flow_id'] ) ) {
			wp_send_json_error( $response_data );
		}

		$flow_id = intval( $_POST['flow_id'] );

		/* Check if CartFlows Post type */
		if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
			wp_send_json_error( $response_data );
		}

		/* Get Steps */
		$steps = get_post_meta( $flow_id, 'wcf-steps', true );

		/* Untrash All steps */
		if ( $steps && is_array( $steps ) ) {
			foreach ( $steps as $step ) {

				/* Need to delete ab test data as well */
				wp_untrash_post( $step['id'] );
			}
		}

		/* Untrash term */
		$term_data = term_exists( 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );

		if ( is_array( $term_data ) ) {
			wp_untrash_post( $term_data['term_id'] );
		}

		/* Finally untrash flow post and it's data */
		wp_untrash_post( $flow_id );

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message' => __( 'Successfully restored the Funnel!', 'cartflows' ),
		);
		wp_send_json_success( $response_data );
	}

	/**
	 * Trash the flow and it's data.
	 */
	public function trash_flow() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_trash_flow', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$response_data = array( 'message' => __( 'Invalid Funnel ID has been supplied to trash!', 'cartflows' ) );

		if ( ! isset( $_POST['flow_id'] ) ) {
			wp_send_json_error( $response_data );
		}

		$flow_id = intval( $_POST['flow_id'] );

		/* Check if CartFlows Post type */
		if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
			wp_send_json_error( $response_data );
		}

		/* Get Steps */
		$steps = get_post_meta( $flow_id, 'wcf-steps', true );

		/* Trash All steps */
		if ( $steps && is_array( $steps ) ) {
			foreach ( $steps as $step ) {

				/* Need to delete ab test data as well */
				wp_trash_post( $step['id'], true );
			}
		}

		/* Trash term */
		$term_data = term_exists( 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );

		if ( is_array( $term_data ) ) {
			wp_trash_post( $term_data['term_id'], CARTFLOWS_TAXONOMY_STEP_FLOW );
		}

		/* Finally trash flow post and it's data */
		wp_trash_post( $flow_id, true );

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message' => __( 'Successfully trashed the Funnel!', 'cartflows' ),
		);
		wp_send_json_success( $response_data );
	}

	/**
	 * Delete the flow and it's data.
	 */
	public function delete_flow() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_delete_flow', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$response_data = array( 'message' => __( 'Invalid Funnel ID has been supplied to delete!', 'cartflows' ) );

		if ( ! isset( $_POST['flow_id'] ) ) {
			wp_send_json_error( $response_data );
		}

		$flow_id = intval( $_POST['flow_id'] );

		/* Check if CartFlows Post type */
		if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
			wp_send_json_error( $response_data );
		}

		/* Get Steps */
		$steps = get_post_meta( $flow_id, 'wcf-steps', true );

		/* Delete All steps */
		if ( $steps && is_array( $steps ) ) {
			foreach ( $steps as $step ) {

				/* Need to delete ab test data as well */
				wp_delete_post( $step['id'], true );
			}
		}

		/* Delete term */
		$term_data = term_exists( 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );

		if ( is_array( $term_data ) ) {
			wp_delete_term( $term_data['term_id'], CARTFLOWS_TAXONOMY_STEP_FLOW );
		}

		/* Finally delete flow post and it's data */
		wp_delete_post( $flow_id, true );

		do_action( 'cartflows_admin_after_delete_flow', $flow_id );

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message' => __( 'Successfully deleted the Funnel!', 'cartflows' ),
		);
		wp_send_json_success( $response_data );
	}

	/**
	 * Update status.
	 */
	public function update_status() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_update_status', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$response_data = array( 'message' => __( 'Invalid Funnel IDs has been supplied to update status!', 'cartflows' ) );

		if ( ! isset( $_POST['flow_id'] ) ) {
			wp_send_json_error( $response_data );
		}

		$flow_id = isset( $_POST['flow_id'] ) ? intval( $_POST['flow_id'] ) : 0;

		/* Check if CartFlows Post type */
		if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
			wp_send_json_error( $response_data );
		}

		$new_status       = isset( $_POST['new_status'] ) ? sanitize_text_field( wp_unslash( $_POST['new_status'] ) ) : '';
		$allowed_statuses = array( 'publish', 'draft', 'trash', 'pending' );
		if ( ! in_array( $new_status, $allowed_statuses, true ) ) {
			wp_send_json_error( array( 'message' => __( 'Invalid post status.', 'cartflows' ) ) );
		}

		/* Get Steps */
		$steps = get_post_meta( $flow_id, 'wcf-steps', true );

		/* Trash All steps */
		if ( $steps && is_array( $steps ) ) {
			foreach ( $steps as $step ) {

				$my_post                = array();
				$my_post['ID']          = $step['id'];
				$my_post['post_status'] = $new_status;
				wp_update_post( wp_slash( $my_post ) );

			}
		}

		/*
			Trash term
		// $term_data = term_exists( 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );

		// if ( is_array( $term_data ) ) {
		// wp_trash_post( $term_data['term_id'], CARTFLOWS_TAXONOMY_STEP_FLOW );
		// }
		*/

		/* Finally trash flow post and it's data */
		$flow_post                = array();
		$flow_post['ID']          = $flow_id;
		$flow_post['post_status'] = $new_status;
		wp_update_post( $flow_post );

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message' => __( 'Successfully updated the Funnel status!', 'cartflows' ),
		);
		wp_send_json_success( $response_data );
	}

	/**
	 * Enables / Disables Store Checkout on toggle click
	 *
	 * @return void
	 * @since X.X.X
	 */
	public function update_store_checkout_status() {
		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_update_store_checkout_status', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		if ( ! isset( $_POST['enable_store_checkout'] ) ) {
			$response_data = array( 'message' => __( 'No Funnel IDs has been supplied to delete!', 'cartflows' ) );
			wp_send_json_error( $response_data );
		}

		$enable_store_checkout = isset( $_POST['enable_store_checkout'] ) ? sanitize_text_field( wp_unslash( $_POST['enable_store_checkout'] ) ) : '';
		$checkout_id           = isset( $_POST['checkout_id'] ) ? absint( wp_unslash( $_POST['checkout_id'] ) ) : '';

		$old_global_checkout = get_option( '_cartflows_old_global_checkout	', false );
		$checkout_id         = $old_global_checkout ? absint( $old_global_checkout ) : $checkout_id;

		$common_settings = \Cartflows_Helper::get_common_settings();

		$override_status = 'enable';
		if ( 'false' === $enable_store_checkout ) {
			$checkout_id     = '';
			$override_status = 'disable';
		}

		$common_settings['global_checkout']          = $checkout_id;
		$common_settings['override_global_checkout'] = $override_status;

		AdminHelper::update_admin_settings_option( '_cartflows_common', $common_settings, false );

		do_action( 'cartflows_after_save_store_checkout' );

		/**
		 * Redirect to the new flow edit screen
		 */
		$response_data = array(
			'message'     => __( 'Successfully updated the Funnel status!', 'cartflows' ),
			'checkout_id' => $checkout_id,
		);
		wp_send_json_success( $response_data );
	}


	/**
	 * Prepare where items for query.
	 */
	public function reorder_flow_steps() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_reorder_flow_steps', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		$flow_id  = false;
		$step_ids = array();

		if ( isset( $_POST['post_id'] ) && isset( $_POST['step_ids'] ) ) {
			$flow_id  = intval( $_POST['post_id'] );
			$step_ids = explode( ',', sanitize_text_field( $_POST['step_ids'] ) );
			$step_ids = array_map( 'intval', $step_ids );
		}

		$response_data = array(
			'status' => false,
			'text'   => __( 'Invalid flow ID has been provided.', 'cartflows' ),
		);

		if ( ! $flow_id ) {
			wp_send_json( $response_data );
		}

		if ( CARTFLOWS_FLOW_POST_TYPE !== get_post_type( $flow_id ) ) {
			wp_send_json( $response_data );
		}

		if ( empty( $step_ids ) ) {
			wp_send_json(
				array(
					'status' => false,
					/* translators: %s flow id */
					'text'   => sprintf( __( 'Steps not sorted for flow - %s', 'cartflows' ), $flow_id ),
				)
			);
		}

		$flow_steps     = get_post_meta( $flow_id, 'wcf-steps', true );
		$flow_steps_map = array();

		if ( is_array( $flow_steps ) ) {
			foreach ( $flow_steps as $key => $value ) {
				$flow_steps_map[ $value['id'] ] = $value;
			}
		}

		$new_flow_steps = array();

		foreach ( $step_ids as $index => $step_id ) {

			$new_flow_step_data = array();

			if ( isset( $flow_steps_map[ $step_id ] ) ) {
				$new_flow_step_data = $flow_steps_map[ $step_id ];
			}

			$new_flow_step_data['id']    = intval( $step_id );
			$new_flow_step_data['title'] = get_the_title( $step_id );
			$new_flow_step_data['type']  = get_post_meta( $step_id, 'wcf-step-type', true );

			$new_flow_steps[] = $new_flow_step_data;
		}

		update_post_meta( $flow_id, 'wcf-steps', $new_flow_steps );

		/* Setup steps data */
		$meta_options = AdminHelper::get_flow_meta_options( $flow_id );
		$steps        = AdminHelper::prepare_step_data( $flow_id, $meta_options );

		$result = array(
			'status' => true,
			/* translators: %s flow id */
			'text'   => sprintf( __( 'Steps sorted for flow - %s', 'cartflows' ), $flow_id ),
			'steps'  => $steps,
		);

		wp_send_json( $result );
	}

	/**
	 * Hide the instant Checkout Notice.
	 *
	 * @since X.X.X
	 * @return void
	 */
	public function hide_instant_checkout_notice() {

		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_hide_instant_checkout_notice', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		if ( ! isset( $_POST['flow_id'] ) ) {
			$response_data = array( 'message' => __( 'No Funnel ID is been supplied', 'cartflows' ) );
			wp_send_json_error( $response_data );
		}

		$flow_id = isset( $_POST['flow_id'] ) ? intval( $_POST['flow_id'] ) : 0;

		// Set dismiss notice option for all flows.
		update_post_meta( $flow_id, 'wcf-instant-checkout-notice-skipped', 'yes' );
		update_option( 'wcf-instant-checkout-notice-skipped', 'yes' );

		$result = array(
			'status'                => true,
			/* translators: %s flow id */
			'text'                  => __( 'Notice Dismissed', 'cartflows' ),
			'instant_notice_status' => 'yes',
		);

		wp_send_json( $result );
	}

	/**
	 * Get published flows for analytics dropdown.
	 *
	 * Returns only ID and title for better performance.
	 *
	 * @since 2.1.19
	 * @return void
	 */
	public function get_published_flows() {
		$response_data = array( 'message' => $this->get_error_msg( 'permission' ) );

		/**
		 * Check permission
		 */
		if ( ! current_user_can( 'cartflows_manage_flows_steps' ) ) {
			wp_send_json_error( $response_data );
		}

		/**
		 * Nonce verification
		 */
		if ( ! check_ajax_referer( 'cartflows_get_published_flows', 'security', false ) ) {
			$response_data = array( 'message' => $this->get_error_msg( 'nonce' ) );
			wp_send_json_error( $response_data );
		}

		// Query only IDs for better performance.
		$flow_ids = get_posts(
			array(
				'post_type'              => CARTFLOWS_FLOW_POST_TYPE,
				'post_status'            => 'publish',
				'posts_per_page'         => -1,
				'fields'                 => 'ids',
				'orderby'                => 'title',
				'order'                  => 'ASC',
				'no_found_rows'          => true, // Skip pagination calculations.
				'update_post_meta_cache' => false, // Skip meta cache.
				'update_post_term_cache' => false, // Skip term cache.
			)
		);

		$flows = array();

		if ( ! empty( $flow_ids ) && is_array( $flow_ids ) ) {
			foreach ( $flow_ids as $flow_id ) {
				$flow_title = get_the_title( $flow_id );

				if ( ! empty( $flow_title ) ) {
					$flows[] = array(
						'flow_id'    => $flow_id,
						'flow_title' => $flow_title,
					);
				}
			}
		}

		wp_send_json_success( array( 'flows' => $flows ) );
	}
}
