/**
  * Processes the btb_checkout_overview shortcode.
  *
  * Based on the set style it calls a sub function to render the output.
  *
  * @param array $atts The shortcode attributes. See class description for explanation.
  */
 public static function btb_checkout_overview_func($atts)
 {
     if (isset($_GET['booking']) && isset($_GET['btbnonce']) && !isset($_POST['btb_checkout_nonce'])) {
         if (!wp_verify_nonce($_GET['btbnonce'], 'btb_direct_booking_nonce')) {
             return;
         }
         $master_instance = get_option('btb_instance_type', 'master') == 'master';
         if ($master_instance) {
             $booking = btb_get_booking($_GET['booking'], OBJECT, 'display');
         } else {
             $booking = btb_get_booking_from_api($_GET['booking'], OBJECT, 'display');
         }
         if (!$booking) {
             return;
         }
         if ($booking->post_type !== "btb_booking") {
             return;
         }
         if ($master_instance) {
             $time = btb_get_time($booking->booked_time, OBJECT, 'display');
         } else {
             $time = btb_get_time_from_api($booking->booked_time, OBJECT, 'display');
         }
         if (!$time) {
             return;
         }
         if ($time->post_type !== "btb_time") {
             return;
         }
         if ($master_instance) {
             $event = btb_get_event($time->event, OBJECT, 'display');
         } else {
             $event = btb_get_event_from_api($time->event, OBJECT, 'display');
         }
         if (!$event) {
             return;
         }
         if ($event->post_type !== "btb_event") {
             return;
         }
         $a = shortcode_atts(array('headline' => ''), $atts);
         switch (get_option('btb_style', 'custom')) {
             case 'avada':
                 return self::btb_checkout_overview_avada($a, $booking, $time, $event);
             case 'bootstrap3':
                 return self::btb_checkout_overview_bs3($a, $booking, $time, $event);
             default:
                 return self::btb_checkout_overview_default($a, $booking, $time, $event);
         }
     }
 }
    /**
     * Processes the @c btb_checkout shortcode.
     *
     * This handles the POST data if avaialble and applies the @c btb_create_checkout_form filter generate
     * the display content. This filter is chosen based on the selected style.
     *
     * @param array $atts The shortcode attributes. See class description for explanation.
     */
    public static function btb_checkout_func($atts)
    {
        $master_instance = get_option('btb_instance_type', 'master') == 'master';
        if (isset($_GET['booking']) && isset($_GET['btbnonce']) && !isset($_POST['btb_checkout_nonce'])) {
            // This part is executed before the customer has entered the data. It shows the form and enqueues
            // the necessary scripts.
            if (!wp_verify_nonce($_GET['btbnonce'], 'btb_direct_booking_nonce')) {
                return '<h4>' . esc_html__('Sorry, there has been an error', 'bt-booking') . '</h4><p>' . esc_html__('Security check failed.', 'bt-booking') . '</p>';
            }
            if ($master_instance) {
                $booking = btb_get_booking(intval($_GET['booking']));
            } else {
                $booking = btb_get_booking_from_api(intval($_GET['booking']), OBJECT, 'display');
            }
            if (!$booking) {
                return '<h4>' . esc_html__('Sorry, there has been an error', 'bt-booking') . '</h4><p>' . esc_html__('Booking not found. Maybe your booking session expired.', 'bt-booking') . '</p>';
            }
            if ($booking->post_type !== "btb_booking") {
                return '<h4>' . esc_html__('Sorry, there has been an error', 'bt-booking') . '</h4><p>' . esc_html__('Booking not found. Maybe your booking session expired.', 'bt-booking') . '</p>';
            }
            wp_localize_script('btb-checkout-script', 'BTBooking', array('require_terms' => get_option('btb_checkout_require_terms', 0), 'strings' => array('first_name' => __('First name', 'bt-booking'), 'last_name' => __('Last name', 'bt-booking'), 'address' => __('Address', 'bt-booking'), 'zip' => __('Postal code', 'bt-booking'), 'city' => __('City', 'bt-booking'), 'email' => __('E-mail address', 'bt-booking'), 'phone' => __('Phone number', 'bt-booking'), 'country' => __('Country', 'bt-booking'), 'email_confirmation_failed' => __('The confirmation of your E-mail address failed. Please check your input.', 'bt-booking'), 'email_check_failed' => __('The entered E-mail address seems not to be valid. Please check your input.', 'bt-booking'), 'missing_input' => __('The following required fields are missing. Please check your input.', 'bt-booking'), 'tems_not_accepted' => __('You have to accept our terms and conditions before you can proceed with your booking.', 'bt-booking'))));
            wp_enqueue_script('btb-checkout-script');
            $a = shortcode_atts(array('headline' => __('Booking data', 'bt-booking')), $atts);
            return apply_filters('btb_create_checkout_form', '', $booking->ID, $a);
        } else {
            if (isset($_POST['btb_checkout_bookingid']) && isset($_POST['btb_checkout_nonce'])) {
                if (!wp_verify_nonce($_POST['btb_checkout_nonce'], 'btb_checkout_data')) {
                    return '<h4>' . esc_html__('Sorry, there has been an error', 'bt-booking') . '</h4><p>' . esc_html__('Security check failed.', 'bt-booking') . '</p>';
                }
                $booking_id = $_POST['btb_checkout_bookingid'];
                if ($master_instance) {
                    $booking = btb_get_booking($booking_id);
                } else {
                    $booking = btb_get_booking_from_api($booking_id, OBJECT, 'display');
                }
                if ($_POST['btb_checkout_cancel'] == "true") {
                    if ($booking && $booking->post_type == "btb_booking") {
                        if ($master_instance) {
                            $desc_page = btb_get_description_page($booking, true);
                        }
                        if ($master_instance) {
                            btb_delete_booking($booking->ID, true);
                        } else {
                            btb_delete_booking_via_api($booking->ID, true);
                        }
                        $ret = '<h4>' . esc_html__('Booking canceled', 'bt-booking') . '</h4>';
                        $ret .= '<p>' . esc_html__('Your booking has been canceled.', 'bt-booking');
                        if ($master_instance) {
                            $ret .= ' <a href="' . $desc_page . '">' . esc_html__('Back to the offer.', 'bt-booking') . '</a></p>';
                        }
                        return $ret;
                    }
                }
                if (!$booking) {
                    return '<h4>' . esc_html__('Sorry, there has been an error', 'bt-booking') . '</h4><p>' . esc_html__('Booking not found. Maybe your booking session expired.', 'bt-booking') . '</p>';
                }
                if ($booking->post_type !== "btb_booking") {
                    return '<h4>' . esc_html__('Sorry, there has been an error', 'bt-booking') . '</h4><p>' . esc_html__('Booking not found. Maybe your booking session expired.', 'bt-booking') . '</p>';
                }
                $booking->title = $_POST['btb_checkout_title'];
                $booking->first_name = sanitize_text_field($_POST['btb_checkout_first_name']);
                $booking->last_name = sanitize_text_field($_POST['btb_checkout_last_name']);
                $booking->company = isset($_POST['btb_checkout_company']) ? sanitize_text_field($_POST['btb_checkout_company']) : null;
                $booking->address = sanitize_text_field($_POST['btb_checkout_address']);
                $booking->address2 = isset($_POST['btb_checkout_address2']) ? sanitize_text_field($_POST['btb_checkout_address2']) : null;
                $booking->zip = sanitize_text_field($_POST['btb_checkout_zip']);
                $booking->city = sanitize_text_field($_POST['btb_checkout_city']);
                $booking->country = $_POST['btb_checkout_country'];
                $booking->email = sanitize_email($_POST['btb_checkout_mail']);
                $booking->phone = sanitize_text_field($_POST['btb_checkout_phone']);
                $booking->notes = isset($_POST['btb_checkout_notes']) ? sanitize_text_field($_POST['btb_checkout_notes']) : null;
                $booking->booking_time = time();
                $booking->booking_status = 'btb_booked';
                if (btb_update_booking($booking) == 0) {
                    if ($master_instance) {
                        $desc_page = btb_get_description_page($booking, true);
                        btb_delete_booking($booking->ID, true);
                    } else {
                        btb_delete_booking_via_api($booking->ID, true);
                    }
                    $ret = '<h4>' . esc_html__('Sorry, but we failed to process your booking.', 'bt-booking') . '</h4>';
                    $ret .= '<p>' . esc_html__('When updating your data an error has occured.', 'bt-booking');
                    if ($master_instance) {
                        $ret .= ' <a href="' . $desc_page . '">' . esc_html__('Please try it again.', 'bt-booking') . '</a></p>';
                    }
                    $ret .= '<p>' . esc_html__('If this error still occures:', 'bt-booking') . ' <a href="' . get_permalink(get_option('btb_general_contact_page')) . '">' . esc_html__('Please contact us.', 'bt-booking') . '</a></p>';
                    return $ret;
                }
                $mail_success = self::send_mails($booking);
                $ret = '<h4>' . esc_html__('Thank you four your booking.', 'bt-booking') . '</h4>';
                // everything went fine
                if ($mail_success == 1) {
                    $ret .= '<p>' . esc_html__('We have successfully received your booking. You will soon receive a confirmation to your e-mail address.', 'bt-booking') . '</p>';
                }
                // mail to operator failed
                if ($mail_success == 0) {
                    $ret .= '<p>' . esc_html__('We have successfully received your booking. You will soon receive a confirmation to your e-mail address.', 'bt-booking') . '</p>';
                    $ret .= '<p>' . esc_html__('Unfortunately, no notification e-mail could be sent to the site operator. Neverthelss your booking has been added properly to our system. If you want to inform us of this error:', 'bt-booking') . ' <a href="' . get_permalink(get_option('btb_general_contact_page')) . '">' . esc_html__('Please contact us.', 'bt-booking') . '</a></p>';
                }
                // mail to customer failed
                if ($mail_success == -1) {
                    $ret .= '<p>' . esc_html__('We have successfully received your booking, but unfortunately there was a problem with delivery of the confirmation to your e-mail address. Therefore, please write down your booking code. Neverthelss your booking has been added properly to our system. In order to still send you a confirmation:', 'bt-booking') . ' <a href="' . get_permalink(get_option('btb_general_contact_page')) . '">' . esc_html__('Please contact us.', 'bt-booking') . '</a></p>';
                }
                // mail to operator and customer failed
                if ($mail_success == -2) {
                    $ret .= '<p>' . esc_html__('We have successfully received your booking, but unfortunately there was a problem with delivery of the notification to the operator and with sending the confirmation to your e-mail address. Therefore, please write down your booking code. Neverthelss your booking has been added properly to our system. In order to still send you a confirmation:', 'bt-booking') . ' <a href="' . get_permalink(get_option('btb_general_contact_page')) . '">' . esc_html__('Please contact us.', 'bt-booking') . '</a></p>';
                }
                $ret .= '<p>' . esc_html__('Your booking code:', 'bt-booking') . ' ' . $booking->code . '</p>';
                return $ret;
            }
        }
        ?>

        <?php 
    }