/home/crealab/cars.brainware.com.co/wp-content/plugins/jet-booking/includes/set-up.php
<?php

namespace JET_ABAF;

use JET_ABAF\Formbuilder_Plugin\Form_Manager;
use JET_ABAF\Formbuilder_Plugin\Jfb_Plugin as Builder_Plugin;

class Set_Up {

	private $setup_page   = null;
	private $success_page = null;

	public function __construct() {
		add_filter( 'jet-abaf/dashboard/helpers/page-config/config', [ $this, 'check_setup' ] );
		add_action( 'wp_ajax_jet_abaf_setup', [ $this, 'process_setup' ] );
	}

	/**
	 * Process setup.
	 *
	 * Setup booking functionalities.
	 *
	 * @since  1.0.0
	 * @since  2.6.2 Added `nonce` security check.
	 * @since  2.8.0 Removed `related_post_type_column` settings handling.
	 * @since  3.0.0 Refactored.
	 * @access public
	 *
	 * @return void
	 */
	public function process_setup() {

		if ( empty( $_REQUEST['nonce'] ) || ! wp_verify_nonce( $_REQUEST['nonce'], 'jet-abaf-set-up' ) ) {
			wp_send_json_error( [
				'message' => __( 'Security check failed.', 'jet-booking' ),
			] );
		}

		if ( ! current_user_can( 'manage_options' ) ) {
			wp_send_json_error( [
				'message' => __( 'Access denied. Not enough permissions.', 'jet-booking' ),
			] );
		}

		$setup_data = ! empty( $_REQUEST['setup_data'] ) ? $_REQUEST['setup_data'] : [];

		if ( ! isset( $setup_data['booking_mode'] ) ) {
			$setup_data['booking_mode'] = 'plain';
		}

		if ( ! isset( $setup_data['wc_integration'] ) ) {
			$setup_data['wc_integration'] = false;
		}

		if ( ! isset( $setup_data['wc_sync_orders'] ) ) {
			$setup_data['wc_sync_orders'] = false;
		}

		if ( ! isset( $setup_data['related_post_type'] ) ) {
			$setup_data['related_post_type'] = false;
		}

		// Clear existing settings before processing set up
		jet_abaf()->settings->clear();

		$create_form  = false;
		$bool         = [ 'wc_integration', 'wc_sync_orders', 'create_single_form' ];
		$form_actions = [ 'create_single_form' ];

		if ( ! empty( $setup_data ) ) {
			foreach ( $setup_data as $setting => $value ) {
				if ( in_array( $setting, $bool ) ) {
					$value = filter_var( $value, FILTER_VALIDATE_BOOLEAN );
				} else {
					$value = is_array( $value ) ? $value : esc_attr( $value );
				}

				if ( jet_abaf()->settings->setting_registered( $setting ) ) {
					jet_abaf()->settings->update( $setting, $value, false );
				} elseif ( in_array( $setting, $form_actions ) && $value ) {
					$create_form = $value;
				}
			}
		}

		if ( 'plain' === $setup_data['booking_mode'] && ! empty( $_REQUEST['db_columns'] ) ) {
			$columns_names = [];

			foreach ( $_REQUEST['db_columns'] as $key => $column ) {
				if ( ! in_array( $column['column'], $columns_names ) && ! empty( $column['column'] ) ) {
					$columns_names[] = $column['column'];
				} else {
					unset( $_REQUEST['db_columns'][$key] );
				}
			}

			jet_abaf()->settings->update( 'additional_columns', $_REQUEST['db_columns'], false );
		}

		jet_abaf()->settings->hook_db_columns();
		jet_abaf()->db->bookings->create_table( true );
		jet_abaf()->db->units->create_table( true );
		jet_abaf()->settings->update( 'is_set', true, false );
		jet_abaf()->settings->write();

		if ( 'plain' === $setup_data['booking_mode'] ) {
			$created_form = [];

			if ( $create_form ) {
				if ( function_exists( 'jet_form_builder' ) ) {
					$created_form = Form_Manager::instance()->insert_form( 'create_single_form' );
				} else {
					$result = Builder_Plugin::install_and_activate();

					if ( $result['success'] ) {
						jet_form_builder_init();

						jet_form_builder()->init_components();
						jet_form_builder()->post_type->register_post_type();

						$created_form = Form_Manager::instance()->insert_form( 'create_single_form' );
					}
				}
			}

			$bookings_cpt = jet_abaf()->settings->get( 'apartment_post_type' );
			$orders_cpt   = jet_abaf()->settings->get( 'related_post_type' );
			$product_id   = jet_abaf()->settings->get( 'wc_product_id' );

			$data = [
				'instances_page' => $bookings_cpt ? add_query_arg( [ 'post_type' => $bookings_cpt ], admin_url( 'edit.php' ) ) : false,
				'orders_page'    => $orders_cpt ? add_query_arg( [ 'post_type' => $orders_cpt ], admin_url( 'edit.php' ) ) : false,
				'wc_integration' => [
					'enabled'      => jet_abaf()->settings->get( 'wc_integration' ),
					'product_link' => $product_id ? get_edit_post_link( $product_id, 'url' ) : false,
					'orders_page'  => add_query_arg( [ 'post_type' => 'shop_order' ], admin_url( 'edit.php' ) ),
				],
				'form'           => $created_form,
			];
		} else {
			$data = [
				'product_link'  => add_query_arg( [ 'post_type' => 'product', 'jet_booking_product' => 1 ], admin_url( 'post-new.php' ) ),
				'bookings_page' => add_query_arg( [ 'page' => 'jet-abaf-bookings' ], admin_url( 'admin.php' ) ),
			];
		}

		wp_send_json_success( wp_parse_args( $data, [
			'settings_url' => $this->success_page->get_url(),
		] ) );

	}

	/**
	 * Register setup page.
	 *
	 * Register setup page for the plugin. If page already registered will throw the error.
	 *
	 * @access public
	 *
	 * @param object $setup_page Dashboard page instance.
	 *
	 * @return void
	 */
	public function register_setup_page( $setup_page ) {
		if ( null !== $this->setup_page ) {
			trigger_error( 'Setup page is already registered!' );
		} else {
			$this->setup_page = $setup_page;
		}
	}

	/**
	 * Register setup success page.
	 *
	 * Register setup success page for the plugin.
	 *
	 * @access public
	 *
	 * @param object $success_page Dashboard page instance.
	 *
	 * @return void
	 */
	public function register_setup_success_page( $success_page ) {
		if ( null !== $this->success_page ) {
			trigger_error( 'Setup page is already registered!' );
		} else {
			$this->success_page = $success_page;
		}
	}

	/**
	 * Check setup.
	 *
	 * Check if plugin is correctly configured and pass this data into appropriate localized data.
	 *
	 * @since  1.0.0
	 * @since  3.0.0 Refactored.
	 * @access public
	 *
	 * @param array $args List of arguments.
	 *
	 * @return array
	 */
	public function check_setup( $args = [] ) {

		$args['setup'] = [
			'is_set'    => jet_abaf()->settings->get( 'is_set' ) || jet_abaf()->db->bookings->is_table_exists(),
			'setup_url' => $this->setup_page->get_url(),
		];

		if ( jet_abaf()->dashboard->is_page_now( $this->setup_page ) ) {
			$args['post_types'] = jet_abaf()->tools->get_post_types_for_js();
			$args['db_fields']  = jet_abaf()->db->get_default_fields();

			$args['reset'] = [
				'is_reset'  => ! empty( $_GET['jet_abaf_reset'] ),
				'reset_url' => add_query_arg( [ 'jet_abaf_reset' => 1 ], $this->setup_page->get_url() ),
			];
		}

		return $args;

	}

}