<?php
namespace WprAddons\Classes\Modules\Forms;

use Elementor\Utils;
use Elementor\Group_Control_Image_Size;
use WprAddons\Classes\Utilities;


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

/**
 * WPR_Form_Builder_Submissions setup
 *
 * @since 3.4.6
 */

 class WPR_Form_Builder_Submissions {

    public function __construct() {
        add_action('wp_ajax_wpr_form_builder_submissions' , [$this, 'add_to_submissions']);
        add_action('wp_ajax_nopriv_wpr_form_builder_submissions',[$this, 'add_to_submissions']);
        add_action('save_post', [$this, 'update_submissions_post_meta']);
    }

    public function add_to_submissions() {

        $nonce = $_POST['nonce'];

        if ( !wp_verify_nonce( $nonce, 'wpr-addons-js' ) || !wpr_fs()->can_use_premium_code() ) {
            return; // Get out of here, the nonce is rotten!
        }

        $new = [
            'post_status' => 'publish',
            'post_type' => 'wpr_submissions'
        ];
        
        $post_id = wp_insert_post( $new );

        foreach ($_POST['form_content'] as $key => $value ) {
            // update_post_meta($post_id, $key, [$value[0], $value[1], $value[2]]);

            $type  = sanitize_key( $value[0] );
            $label = $this->wpr_sanitize_form_field( $type, $value[1] );
            $input = sanitize_text_field( $value[2] );

            update_post_meta(
                $post_id,
                sanitize_key( $key ),
                [ $type, $label, $input ]
            );
        }

        $sanitized_form_name = sanitize_text_field($_POST['form_name']);
        $sanitized_form_id = sanitize_text_field($_POST['form_id']);
        $sanitized_form_page = sanitize_text_field($_POST['form_page']);
        $sanitized_form_page_id = sanitize_text_field($_POST['form_page_id']);
    
        update_post_meta($post_id, 'wpr_form_name', $sanitized_form_name);
        update_post_meta($post_id, 'wpr_form_id', $sanitized_form_id);
        update_post_meta($post_id, 'wpr_form_page', $sanitized_form_page);
        update_post_meta($post_id, 'wpr_form_page_id', $sanitized_form_page_id);
        update_post_meta($post_id, 'wpr_user_agent', sanitize_textarea_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ));
        update_post_meta($post_id, 'wpr_user_ip', Utilities::get_client_ip());

        // One-time secret for updating submission action meta (see WPR_Actions_Status); not guessable per post_id.
        $submission_action_secret = '';
        if ( $post_id ) {
            $submission_action_secret = bin2hex( random_bytes( 32 ) );
            update_post_meta( $post_id, '_wpr_submission_action_secret', $submission_action_secret );
        }
        
        if( $post_id ) {
            wp_send_json_success(array(
                'action' => 'wpr_form_builder_submissions',
                'post_id' => $post_id,
                'submission_secret' => $submission_action_secret,
                'message' => esc_html__('Submission created successfully', 'wpr-addons'),
				'status' => 'success',
                'content' => $_POST['form_content']
            ));
        } else {
            wp_send_json_success(array(
                'action' => 'wpr_form_builder_submissions',
                'post_id' => $post_id,
                'message' => esc_html__('Submit action failed', 'wpr-addons'),
				'status' => 'error'
            ));
        }
    }
    
    public function update_submissions_post_meta($post_id) {
        // Only allow users with edit permissions
        if ( ! current_user_can('edit_post', $post_id) ) {
            return;
        }
    
        if ( isset($_POST['wpr_submission_changes']) && ! empty($_POST['wpr_submission_changes']) ) {
            $changes = json_decode(stripslashes($_POST['wpr_submission_changes']), true);
    
            if ( ! is_array($changes) ) {
                return;
            }
    
            // List of disallowed meta keys
            $disallowed_keys = [
                '_elementor_data',
                '_elementor_controls_usage',
                '_wp_attached_file',
                '_wpr_submission_action_secret',
                // Add more if needed
            ];
    
            foreach ( $changes as $key => $value ) {
                // Skip blacklisted keys
                if ( in_array($key, $disallowed_keys, true) ) {
                    continue;
                }
    
                // Sanitize key and value
                $safe_key = sanitize_key($key);
    
                if ( is_string($value) ) {
                    $safe_value = sanitize_text_field($value);
                } elseif ( is_array($value) ) {
                    $safe_value = array_map('sanitize_text_field', $value);
                } else {
                    $safe_value = sanitize_text_field((string) $value);
                }
    
                update_post_meta($post_id, $safe_key, $safe_value);
            }
        }
    }
    
    public function wpr_sanitize_form_field( $type, $value ) {
        // if ( is_array( $value ) ) {
        //     return array_map( function( $item ) use ( $type ) {
        //         return $this->wpr_sanitize_form_field( $type, $item );
        //     }, $value );
        // }

        switch ( $type ) {

            case 'email':
                return sanitize_email( $value );

            case 'url':
                return esc_url_raw( $value );

            case 'file':
                if ( is_array( $value ) ) {
                    return array_map( 'esc_url_raw', $value );
                } else {
                    return esc_url_raw( $value );
                }

            case 'number':
                return is_numeric( $value ) ? $value + 0 : '';

            case 'tel':
                return preg_replace( '/[^0-9+\-\s\(\)]/', '', $value );

            case 'textarea':
                return sanitize_textarea_field( $value );

            case 'radio':
            case 'checkbox':
                if ( is_array( $value ) ) {
                    return array_map( function( $item ) use ( $type ) {
                        return $this->wpr_sanitize_form_field( $type, $item );
                    }, $value );
                }

            case 'html':
                return wp_kses_post( $value ); // VERY IMPORTANT

            case 'hidden':
            case 'password':
            case 'text':
            case 'date':
            case 'time':
            case 'select':
            default:
                return sanitize_text_field( $value );
        }
    }

 }

 new WPR_Form_Builder_Submissions();