/home/hamzarou/www/wp-content/plugins/sms-alert/handler/forms/class-formidable.php
<?php
/**
 * This file handles formidable form via sms notification
 *
 * PHP version 5
 *
 * @category Handler
 * @package  SMSAlert
 * @author   SMS Alert <support@cozyvision.com>
 * @license  URI: http://www.gnu.org/licenses/gpl-2.0.html
 * @link     https://www.smsalert.co.in/
 */

if (! defined('ABSPATH') ) {
    exit;
}

if (! is_plugin_active('formidable/formidable.php') ) {
    return; 
}

/**
 * PHP version 5
 *
 * @category Handler
 * @package  SMSAlert
 * @author   SMS Alert <support@cozyvision.com>
 * @license  URI: http://www.gnu.org/licenses/gpl-2.0.html
 * @link     https://www.smsalert.co.in/
 * Formidable class.
 */
class Formidable extends FormInterface
{

    /**
     * Form Session Variable.
     *
     * @var stirng
     */
    private $form_session_var = FormSessionVars::FORMIDABLE;

    /**
     * Handle OTP form
     *
     * @return void
     */
    public function handleForm()
    {
        $user_authorize = new smsalert_Setting_Options();
        if ($user_authorize->is_user_authorised() ) {
            $setting = new FrmSettings();
            $recaptcha_v =  $setting->re_type;
            if ($recaptcha_v === 'v3' || $recaptcha_v === 'invisible') {
                add_filter('frm_recaptcha_js_url', array( $this, 'captchaReset'), 1);
            }
            add_filter('frm_validate_entry', array( $this, 'validateValue'), 10, 3);
            add_filter('frm_fields_to_validate', array( $this, 'byPassValidateFields' ), 10, 2);
            add_filter('frm_add_form_settings_section', array( $this, 'frmAddSettings' ), 10, 2);
            add_filter('frm_submit_button_html', array( $this, 'addCustomHtmlToSubmitButton'), 10, 2);
            add_action('frm_after_create_entry', array( $this, 'formidableFormSubmit'), 30, 2);
            add_filter('frm_validate_form', array( $this, 'smsalertFormidableShowWarnings'), 10, 2);
        }
    }
    
    /**
     * This function captchaReset.
     *
     * @param $url Form url
     *
     * @return void.
     */
    public function captchaReset($url)
    {
        return str_replace('frmRecaptcha', 'saRecaptcha', $url);
    }
     /**
      * This function Reset captcha.
      *
      * @param $form form
      *
      * @return void.
      */
    public function ResetRecaptcha($form)
    {
        return str_replace('frmAfterRecaptcha', '', $form);
    }
    
    /**
     * This function by Pass Validate Fields.
     *
     * @param $fields Form fields
     * @param $args   args
     *
     * @return void.
     */
    public function byPassValidateFields($fields, $args)
    {
        SmsAlertUtility::checkSession();         
        if (isset($_SESSION['sa_mobile_verified'])  ) {
            unset($_SESSION['sa_mobile_verified']);
            foreach ($fields as $key=>$field) {
                if ($field->type == 'captcha') {
                    unset($fields[$key]);
                }
            }  
        }
        return $fields; 
    }
    
    /**
     * This function shows validation error message.
     *
     * @param $errors errors
     * @param $values values
     * @param $args   args
     *
     * @return void.
     */
    public function validateValue($errors, $values, $args)
    {   
        if (! empty($errors)) {
            return $errors;
        }
        $form_id = $values['form_id'];           
        if (isset($_REQUEST['option']) && 'smsalert_frm_show_form_otp' === sanitize_text_field(wp_unslash($_REQUEST['option']))) {
            SmsAlertUtility::initialize_transaction($this->form_session_var);
        } else {
            return;
        }        
        $datas = self::get_form_settings($form_id);
        $visitor_phone         = isset($datas['visitor_phone'])?$datas['visitor_phone']:'';
        $phone = !empty($_POST['item_meta'][$visitor_phone])?$_POST['item_meta'][$visitor_phone]:'';          
        if (isset($phone) && SmsAlertUtility::isBlank($phone)) {            
            wp_send_json(SmsAlertUtility::_create_json_response(__('Please enter phone number.', 'sms-alert'), SmsAlertConstants::ERROR_JSON_TYPE));
            exit();
        }
        return $this->processFormFields($phone);            
    }
    
    /**
     * This function processed form fields.
     *
     * @param string $phone User phone.
     *
     * @return bool
     */
    public function processFormFields( $phone )
    {
        global $phoneLogic;
        $phone_num = preg_replace('/[^0-9]/', '', $phone);
        if (! isset($phone_num) || ! SmsAlertUtility::validatePhoneNumber($phone_num) ) {
            wp_send_json(SmsAlertUtility::_create_json_response(str_replace('##phone##', $phone_num, $phoneLogic->_get_otp_invalid_format_message()), SmsAlertConstants::ERROR_JSON_TYPE));
            exit();
        }        
        smsalert_site_challenge_otp('test', null, null, $phone_num, 'phone', null, null, 'ajax');
    }


    /**
     * Add smsalert shortcode
     *
     * @param string $button button.
     * @param array  $args   args.
     *
     * @return void
     */
    function addCustomHtmlToSubmitButton( $button, $args )
    {
        $form_id = $args['form']->id;
        global $wpdb;
        $datas = self::get_form_settings($form_id);
        if (!empty($datas)) {
            $smsalert_enable_message     = isset($datas['smsalert_enable_message'])?$datas['smsalert_enable_message']:'';
            $enable_otp                 = isset($datas['smsalert_enable_otp'])?$datas['smsalert_enable_otp']:'';
            $visitor_phone                 = isset($datas['visitor_phone'])?$datas['visitor_phone']:'';

            if (( '1' === $smsalert_enable_message || '1' === $enable_otp ) && $visitor_phone!='') {
                $field_table_name = $wpdb->prefix . 'frm_fields';
                $results = $wpdb->get_results("SELECT * FROM $field_table_name where `id`=$visitor_phone and `form_id`=$form_id");

                if (!empty($results) && '1' === $enable_otp ) {
                    $frm_settings = new FrmSettings();
                    $recaptcha_v =  $frm_settings->re_type;
                    if (($recaptcha_v === 'v3' || $recaptcha_v === 'invisible') && !$frm_settings->re_multi) {
                        add_filter('frm_filter_final_form', array( $this, 'ResetRecaptcha'), 1);
                    }
                    echo do_shortcode('[sa_verify id="form1" phone_selector="#field_'.$results[0]->field_key.'" submit_selector= ".frm_button_submit" ]');
                } else {
                    $formidable_js = '
					document.addEventListener("DOMContentLoaded", function() {
					var mob_field = jQuery("#field_' . esc_attr($results[0]->field_key) . '");
					mob_field.addClass("phone-valid");
					var error_show = "<span class=\"error sa_phone_error\" style=\"display:none\"></span>";
					mob_field.after(error_show);
					var default_cc = (typeof sa_country_settings !="undefined" && sa_country_settings["sa_default_countrycode"] && sa_country_settings["sa_default_countrycode"]!="") ? sa_country_settings["sa_default_countrycode"] : "";
					var show_default_cc = "";
						mob_field.intlTelInput("destroy");
					});
					';

                    wp_add_inline_script("sa-handle-footer", $formidable_js);
                }
            }
        }
        return $button;
    }
    
    /**
     * Show warning if phone field not selected.
     *
     * @param array $errors errors.
     * @param array $values values.
     *
     * @return void
     */
    public function smsalertFormidableShowWarnings($errors, $values )
    {
        $enable_message = !empty($values['options']['smsalert_enable_message']) ? $values['options']['smsalert_enable_message'] : "";
        $visitor_phone     = !empty($values['options']['visitor_phone']) ? $values['options']['visitor_phone'] : "";
        $enable_otp     = !empty($values['options']['smsalert_enable_otp']) ? $values['options']['smsalert_enable_otp'] : "";

        if ((!empty($enable_message) || !empty($enable_otp)) && empty($visitor_phone)) {                
            $errors[] = esc_html__(
                '
					Please choose SMS Alert phone field in SMS Alert tab', 'sms-alert' 
            );
        }   
        return $errors;     
    }

    /**
     * Display get form settings
     *
     * @param int $form_id form_id.
     *
     * @return void
     */
    public function get_form_settings( $form_id )
    {
        global $wpdb;
        $form_table_name     = $wpdb->prefix . 'frm_forms';
        $data                 = $wpdb->get_results("SELECT * FROM $form_table_name where `id`=$form_id");
        $datas                 = maybe_unserialize($data[0]->options);
        return $datas;
    }

    /**
     * Display get form fields
     *
     * @param int $form_id form_id.
     *
     * @return void
     */
    public static function getFormFields( $form_id )
    {
        global $wpdb;
        $table_name = $wpdb->prefix . 'frm_fields';
        $results     = $wpdb->get_results("SELECT * FROM $table_name where `form_id`=$form_id");
        return $results;
    }

    /**
     * Display smsalert settings
     *
     * @param array $sections sections.
     * @param array $values   values.
     *
     * @return void
     */
    public function frmAddSettings( $sections,$values )
    {
        $sections['smsalert'] = array(
        'name'     => __('SMS Alert', 'sms-alert'),
        'title'    => __('SMS Alert Settings', 'sms-alert'),
        'function' => array( 'Formidable', 'smsalert_settings' ),
        'id'       => 'frm_smsalert_settings',
        'icon'     => 'frm_icon_font frm_mail_bulk_icon',
        );
        return $sections;
    }

    /**
     * Display smsalert settings page
     *
     * @param array $values values.
     *
     * @return void
     */
    public static function smsalert_settings( $values )
    {
        include plugin_dir_path(__DIR__) . '../views/formidable-settings.php';
    }

    /**
     * Process wp form submission and send sms
     *
     * @param int $entry_id entity id.
     * @param int $form_id  form id.
     *
     * @return void
     */
    public function formidableFormSubmit( $entry_id, $form_id )
    {
        $datas = self::get_form_settings($form_id);
        
        if (!empty($datas)) {
            $enable_message     = isset($datas['smsalert_enable_message'])?$datas['smsalert_enable_message']:'';
            $visitor_phone         = isset($datas['visitor_phone'])?$datas['visitor_phone']:'';
            $visitor_message     = isset($datas['visitor_message'])?$datas['visitor_message']:'';
            $admin_number         = isset($datas['admin_number'])?$datas['admin_number']:'';
            $admin_message         = isset($datas['admin_message'])?$datas['admin_message']:'';
            if ('1' === $enable_message && '' != $visitor_message ) {
                if (isset($_POST['item_meta'][$visitor_phone])) {
                    $phone = $_POST['item_meta'][$visitor_phone];
                    do_action('sa_send_sms', $phone,  self::parseSmsContent($form_id, $visitor_message));
                }
            }
            if (!empty($admin_number) ) {
                do_action('sa_send_sms', $admin_number, self::parseSmsContent($form_id, $admin_message));
            }
        }
    }

    /**
     * Check your otp setting is enabled or not.
     *
     * @return bool
     */
    public static function isFormEnabled()
    {
        $user_authorize = new smsalert_Setting_Options();
        $islogged       = $user_authorize->is_user_authorised();
        return ( $islogged && is_plugin_active('formidable/formidable.php') ) ? true : false;
    }

    /**
     * Handle after failed verification
     *
     * @param object $user_login   users object.
     * @param string $user_email   user email.
     * @param string $phone_number phone number.
     *
     * @return void
     */
    public function handle_failed_verification( $user_login, $user_email, $phone_number )
    {
        SmsAlertUtility::checkSession();
        if (! isset($_SESSION[ $this->form_session_var ]) ) {
            return;
        }
        if (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-validate-otp-form' ) {
            wp_send_json(SmsAlertUtility::_create_json_response(__('Invalid one time passcode. Please enter a valid passcode.', 'sms-alert'), 'error'));
            exit();
        } else {
            $_SESSION[ $this->form_session_var ] = 'verification_failed';
        }
    }

    /**
     * Handle after post verification
     *
     * @param string $redirect_to  redirect url.
     * @param object $user_login   user object.
     * @param string $user_email   user email.
     * @param string $password     user password.
     * @param string $phone_number phone number.
     * @param string $extra_data   extra hidden fields.
     *
     * @return void
     */
    public function handle_post_verification( $redirect_to, $user_login, $user_email, $password, $phone_number, $extra_data )
    {
        SmsAlertUtility::checkSession();
        if (! isset($_SESSION[ $this->form_session_var ]) ) {
            return;
        }
        $_SESSION['sa_mobile_verified'] = true;
        if (! empty($_REQUEST['option']) && sanitize_text_field(wp_unslash($_REQUEST['option'])) === 'smsalert-validate-otp-form' ) {
            wp_send_json(SmsAlertUtility::_create_json_response(__('OTP Validated Successfully.', 'sms-alert'), 'success'));
            exit();
        } else {
            $_SESSION[ $this->form_session_var ] = 'validated';
        }
    }

    /**
     * Clear otp session variable
     *
     * @return void
     */
    public function unsetOTPSessionVariables()
    {
        unset($_SESSION[ $this->tx_session_id ]);
        unset($_SESSION[ $this->form_session_var ]);
    }

    /**
     * Check current form submission is ajax or not
     *
     * @param bool $is_ajax bool value for form type.
     *
     * @return bool
     */
    public function is_ajax_form_in_play( $is_ajax )
    {
        SmsAlertUtility::checkSession();
        return isset($_SESSION[ $this->form_session_var ]) ? true : $is_ajax;
    }

    /**
     * Replace variables for sms contennt
     *
     * @param int    $form_id form id.
     * @param string $content sms content to be sent.
     *
     * @return string
     */
    public static function parseSmsContent( $form_id, $content = null )
    {
        $find=array();$replace=array();
        $fields = self::getFormFields($form_id);
        foreach ($fields as $field) {
            $find[]        = '['.$field->name.'_'.$field->id.']';
            $val         = !empty($_POST['item_meta'][$field->id])?$_POST['item_meta'][$field->id]:'';
            $replace[]     = is_array($val) ? current($val) : $val;
        }
        $content = str_replace($find, $replace, $content);
        return $content;
    }

    /**
     * Handle form for WordPress backend
     *
     * @return void
     */
    public function handleFormOptions()
    {  
    }
}
new Formidable();