<?php
/**
 * The-global functionality of the plugin.
 *
 * Defines the plugin name, version, and two examples hooks for how to enqueue the-global stylesheet and JavaScript.
 *
 * @link       padresenlanube.com/
 * @since      1.0.0
 * @package    USERSPN
 * @subpackage USERSPN/includes
 * @author     Padres en la Nube <info@padresenlanube.com>
 */
class USERSPN_Common {

	/**
	 * The ID of this plugin.
	 *
	 * @since    1.0.0
	 * @access   private
	 * @var      string    $plugin_name    The ID of this plugin.
	 */
	private $plugin_name;

	/**
	 * The version of this plugin.
	 *
	 * @since    1.0.0
	 * @access   private
	 * @var      string    $version    The current version of this plugin.
	 */
	private $version;

	/**
	 * Initialize the class and set its properties.
	 *
	 * @since    1.0.0
	 * @param      string    $plugin_name       The name of this plugin.
	 * @param      string    $version    The version of this plugin.
	 */
	public function __construct($plugin_name, $version) {
		$this->plugin_name = $plugin_name;
		$this->version = $version;
	}

	/**
	 * Register the stylesheets.
	 *
	 * @since    1.0.0
	 */
	public function userspn_enqueue_styles() {
		if (!wp_style_is('wph-material-icons-outlined', 'enqueued')) {
			wp_enqueue_style('wph-material-icons-outlined', USERSPN_URL . 'assets/css/material-icons-outlined.min.css', [], $this->version, 'all');
		}

		if (!wp_style_is('wph-trumbowyg', 'enqueued')) {
			wp_enqueue_style('wph-trumbowyg', USERSPN_URL . 'assets/css/trumbowyg.min.css', [], $this->version, 'all');
		}

		if (!wp_style_is($this->plugin_name . '-selector', 'enqueued')) {
			wp_enqueue_style($this->plugin_name . '-selector', USERSPN_URL . 'assets/css/userspn-selector.css', [], $this->version, 'all');
    	}

		if (!wp_style_is($this->plugin_name . '-popups', 'enqueued')) {
			wp_enqueue_style($this->plugin_name . '-popups', USERSPN_URL . 'assets/css/userspn-popups.css', [], $this->version, 'all');
		}

		if (!wp_style_is('userspn-tooltips', 'enqueued')) {
			wp_enqueue_style('userspn-tooltips', USERSPN_URL . 'assets/css/userspn-tooltips.css', [], $this->version, 'all');
		}

		if (!wp_style_is('wph-owl', 'enqueued')) {
			wp_enqueue_style('wph-owl', USERSPN_URL . 'assets/css/owl.min.css', [], $this->version, 'all');
		}

		if (!wp_style_is($this->plugin_name . '-datatables', 'enqueued')) {
			wp_enqueue_style($this->plugin_name . '-datatables', USERSPN_URL . 'assets/css/datatables.min.css', [], $this->version, 'all');
		}

		wp_enqueue_style($this->plugin_name, USERSPN_URL . 'assets/css/userspn.css', [], $this->version, 'all');
		wp_enqueue_style('userspn-profile-completion', USERSPN_URL . 'assets/css/userspn-profile-completion.css', [], $this->version, 'all');

		if (get_option('userspn_woocommerce_tab') == 'on' && class_exists('WooCommerce')) {
			wp_enqueue_style('woocommerce-general');
			wp_enqueue_style('woocommerce-layout');
			wp_enqueue_style('woocommerce-smallscreen');
		}

		// Add dynamic CSS variables for design customization
		$this->userspn_add_dynamic_css_variables();
	}

	/**
	 * Add dynamic CSS variables based on settings.
	 *
	 * @since    1.0.0
	 */
	private function userspn_add_dynamic_css_variables() {
		// Get color values from options, with defaults
		$color_main = get_option('userspn_color_main', '#00aa44');
		$bg_color_main = get_option('userspn_bg_color_main', '#00aa44');
		$border_color_main = get_option('userspn_border_color_main', '#00aa44');
		$color_main_alt = get_option('userspn_color_main_alt', '#232323');
		$bg_color_main_alt = get_option('userspn_bg_color_main_alt', '#232323');
		$border_color_main_alt = get_option('userspn_border_color_main_alt', '#232323');
		$color_main_blue = get_option('userspn_color_main_blue', '#6e6eff');

		// Build CSS with custom variables
		$custom_css = ':root {';
		$custom_css .= '--userspn-color-main:' . esc_attr($color_main) . ';';
		$custom_css .= '--userspn-bg-color-main:' . esc_attr($bg_color_main) . ';';
		$custom_css .= '--userspn-border-color-main:' . esc_attr($border_color_main) . ';';
		$custom_css .= '--userspn-color-main-alt:' . esc_attr($color_main_alt) . ';';
		$custom_css .= '--userspn-bg-color-main-alt:' . esc_attr($bg_color_main_alt) . ';';
		$custom_css .= '--userspn-border-color-main-alt:' . esc_attr($border_color_main_alt) . ';';
		$custom_css .= '--userspn-color-main-blue:' . esc_attr($color_main_blue) . ';';
		$custom_css .= '}';

		// Add inline style after the main CSS
		wp_add_inline_style($this->plugin_name, $custom_css);
	}

	/**
	 * Register the JavaScript.
	 *
	 * @since    1.0.0
	 */
	public function userspn_enqueue_scripts() {
		if(!wp_script_is('jquery-ui-sortable', 'enqueued')) {
				wp_enqueue_script('jquery-ui-sortable');
		}

		if(!wp_script_is($this->plugin_name . '-selector', 'enqueued')) {
			wp_enqueue_script($this->plugin_name . '-selector', USERSPN_URL . 'assets/js/userspn-selector.js', ['jquery'], $this->version, false);
		}

		if(!wp_script_is('wph-trumbowyg', 'enqueued')) {
			wp_enqueue_script('wph-trumbowyg', USERSPN_URL . 'assets/js/trumbowyg.min.js', ['jquery'], $this->version, false);
		}

		if(!wp_script_is($this->plugin_name . '-popups', 'enqueued')) {
			wp_enqueue_script($this->plugin_name . '-popups', USERSPN_URL . 'assets/js/userspn-popups.js', ['jquery'], $this->version, false);
		}

		if(!wp_script_is('userspn-tooltips', 'enqueued')) {
			wp_enqueue_script('userspn-tooltips', USERSPN_URL . 'assets/js/userspn-tooltips.js', ['jquery'], $this->version, false);
		}

		if(!wp_script_is('wph-owl', 'enqueued')) {
			wp_enqueue_script('wph-owl', USERSPN_URL . 'assets/js/owl.min.js', ['jquery'], $this->version, false);
		}

		if(!wp_script_is($this->plugin_name . '-datatables', 'enqueued')) {
			wp_enqueue_script($this->plugin_name . '-datatables', USERSPN_URL . 'assets/js/datatables.min.js', ['jquery'], $this->version, false);
		}

		// Add cache-busting for private windows and ensure proper loading
		$script_version = $this->version;

		wp_enqueue_script($this->plugin_name, USERSPN_URL . 'assets/js/userspn.js', ['jquery'], $script_version, false);
		wp_enqueue_script($this->plugin_name . '-ajax', USERSPN_URL . 'assets/js/userspn-ajax.js', ['jquery'], $this->version, false);
		wp_enqueue_script($this->plugin_name . '-aux', USERSPN_URL . 'assets/js/userspn-aux.js', ['jquery'], $this->version, false);
		wp_enqueue_script($this->plugin_name . '-forms', USERSPN_URL . 'assets/js/userspn-forms.js', ['jquery', 'jquery-ui-sortable'], $this->version, false);
		wp_enqueue_script($this->plugin_name . '-input-editor-builder', USERSPN_URL . 'assets/js/userspn-input-editor-builder.js', ['jquery'], $this->version, false);
		wp_enqueue_script($this->plugin_name . '-profile-progress', USERSPN_URL . 'assets/js/userspn-profile-progress.js', ['jquery'], $this->version, false);

		// Load bot analysis script
		wp_enqueue_script($this->plugin_name . '-bot-analysis', USERSPN_URL . 'assets/js/userspn-bot-analysis.js', ['jquery'], $this->version, false);

		// Load Chart.js for bot analysis charts (only in admin)
		if (is_admin()) {
			wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', [], '4.4.0', true);
		}

		// Scripts previously enqueued inside shortcodes/render methods - moved here for FSE/block theme compatibility
		if (!is_admin()) {
			wp_enqueue_script('userspn-user-profile-image', USERSPN_URL . 'assets/js/userspn-user-profile-image.js', ['jquery'], $this->version, false);
			wp_enqueue_script('userspn-user-register-form', USERSPN_URL . 'assets/js/userspn-user-register-form.js', ['jquery'], $this->version, false);
			wp_enqueue_script('userspn-upload-private-files-btn', USERSPN_URL . 'assets/js/userspn-upload-private-files-btn.js', ['jquery'], $this->version, false);
			wp_enqueue_script('userspn-notifications', USERSPN_URL . 'assets/js/userspn-notifications.js', ['jquery'], $this->version, false);

			// Enqueue profile fields validation script if user is logged in and has pending required fields
			if (is_user_logged_in()) {
				$plugin_user = new USERSPN_Functions_User();
				$userspn_fields = $plugin_user->userspn_user_register_get_fields([]);
				$user_id = get_current_user_id();
				$has_pending = false;

				if (!empty($userspn_fields)) {
					foreach ($userspn_fields as $field) {
						if (!empty($field['required']) && $field['required'] && empty(get_user_meta($user_id, $field['id'], true))) {
							$has_pending = true;
							break;
						}
					}
				}

				if ($has_pending) {
					wp_enqueue_script($this->plugin_name . '-profile-fields-validation', USERSPN_URL . 'assets/js/userspn-profile-fields-validation.js', ['jquery', $this->plugin_name . '-popups', $this->plugin_name], $this->version, false);
				}
			}
		}

		$nonce = wp_create_nonce('userspn-nonce');
		wp_localize_script($this->plugin_name, 'userspn_ajax', [
			'ajax_url' => admin_url('admin-ajax.php'),
			'userspn_ajax_nonce' => $nonce,
			'home_url' => home_url('/'),
		]);

		// Add CPTs data to JavaScript
		$userspn_cpts = defined('USERSPN_CPTS') ? USERSPN_CPTS : [];
		wp_localize_script($this->plugin_name . '-ajax', 'userspn_cpts', $userspn_cpts);

		// Verify nonce for GET parameters
		$nonce_verified = false;
		if (!empty($_GET['userspn_nonce'])) {
			$nonce_verified = wp_verify_nonce(sanitize_text_field(wp_unslash($_GET['userspn_nonce'])), 'userspn-get-nonce');
		}

		// Allow bypass via explicit GET parameter
		$bypass_nonce = (!empty($_GET['userspn_nonce_skip']) && $_GET['userspn_nonce_skip'] == '1') || (!empty($_GET['userspn_skip_nonce']) && $_GET['userspn_skip_nonce'] == '1');

		$userspn_action = '';
		$userspn_btn_id = '';
		$userspn_popup = '';
		$userspn_tab = '';

		if ($nonce_verified || $bypass_nonce) {
			$userspn_action = !empty($_GET['userspn_action']) ? USERSPN_Forms::userspn_sanitizer(wp_unslash($_GET['userspn_action'])) : '';
			$userspn_btn_id = !empty($_GET['userspn_btn_id']) ? USERSPN_Forms::userspn_sanitizer(wp_unslash($_GET['userspn_btn_id'])) : '';
			$userspn_popup = !empty($_GET['userspn_popup']) ? USERSPN_Forms::userspn_sanitizer(wp_unslash($_GET['userspn_popup'])) : '';
			$userspn_tab = !empty($_GET['userspn_tab']) ? USERSPN_Forms::userspn_sanitizer(wp_unslash($_GET['userspn_tab'])) : '';
		}
		
		wp_localize_script($this->plugin_name, 'userspn_action', [
			'action' => $userspn_action,
			'btn_id' => $userspn_btn_id,
			'popup' => $userspn_popup,
			'tab' => $userspn_tab,
			'userspn_get_nonce' => wp_create_nonce('userspn-get-nonce'),
		]);

		wp_localize_script($this->plugin_name, 'userspn_path', [
			'main' => USERSPN_URL,
			'assets' => USERSPN_URL . 'assets/',
			'css' => USERSPN_URL . 'assets/css/',
			'js' => USERSPN_URL . 'assets/js/',
			'media' => USERSPN_URL . 'assets/media/',
		]);

		if (class_exists('MAILPN')) {
			wp_localize_script($this->plugin_name, 'mailpn_ajax', [
				'mailpn_class' => class_exists('MAILPN_Ajax') ? true : false,
				'ajax_url' => admin_url('admin-ajax.php'),
				'mailpn_ajax_nonce' => wp_create_nonce('mailpn-nonce'),
			]);
		}

		wp_localize_script($this->plugin_name, 'userspn_path', [
			'main' => USERSPN_URL,
			'assets' => USERSPN_URL . 'assets/',
			'css' => USERSPN_URL . 'assets/css/',
			'js' => USERSPN_URL . 'assets/js/',
			'media' => USERSPN_URL . 'assets/media/',
		]);

		wp_localize_script($this->plugin_name, 'userspn_newsletter', [
			'exit_popup' => (get_option('userspn_newsletter_exit_popup') == 'on') ? true : false,
			'is_user_logged_in' => is_user_logged_in(),
			'exit_popup_empty' => (get_option('userspn_newsletter_exit_popup_empty') == 'on') ? true : false,
		]);

		wp_localize_script($this->plugin_name, 'userspn_trumbowyg', [
			'path' => USERSPN_URL . 'assets/media/trumbowyg-icons.svg',
		]);

		wp_localize_script($this->plugin_name, 'userspn_i18n', [
			'complete_required_fields' => __('Please complete all required fields', 'userspn'),
			'completed' => __('Completed', 'userspn'),
			'pending' => __('Pending', 'userspn'),
			'get_locale' => get_locale(),
			'an_error_has_occurred' => esc_html(__('An error has occurred. Please try again in a few minutes.', 'userspn')),
			'user_unlogged' => esc_html(__('Please create a new user or login to save the information.', 'userspn')),
			'saved_successfully' => esc_html(__('Saved successfully', 'userspn')),
			'edit_image' => esc_html(__('Edit image', 'userspn')),
			'edit_images' => esc_html(__('Edit images', 'userspn')),
			'select_image' => esc_html(__('Select image', 'userspn')),
			'select_images' => esc_html(__('Select images', 'userspn')),
			'edit_video' => esc_html(__('Edit video', 'userspn')),
			'edit_videos' => esc_html(__('Edit videos', 'userspn')),
			'select_video' => esc_html(__('Select video', 'userspn')),
			'select_videos' => esc_html(__('Select videos', 'userspn')),
			'edit_audio' => esc_html(__('Edit audio', 'userspn')),
			'edit_audios' => esc_html(__('Edit audios', 'userspn')),
			'select_audio' => esc_html(__('Select audio', 'userspn')),
			'select_audios' => esc_html(__('Select audios', 'userspn')),
			'edit_file' => esc_html(__('Edit file', 'userspn')),
			'edit_files' => esc_html(__('Edit files', 'userspn')),
			'select_file' => esc_html(__('Select file', 'userspn')),
			'select_files' => esc_html(__('Select files', 'userspn')),
			'ordered_element' => esc_html(__('Ordered element', 'userspn')),
			'password_not_correct' => esc_html(__('The password is not correct. Please try again', 'userspn')),
			'include_password' => esc_html(__('Please, include your account password to complete the operation', 'userspn')),
			'user_removed' => esc_html(__('The user has been successfully removed from the system. Reloading...', 'userspn')),
			'user_existing' => esc_html(__('Existing user. Please login.', 'userspn')),
			'user_created' => esc_html(__('User created. Please login.', 'userspn')),
			'user_created_check_email' => esc_html(__('Your account has been created. Please check your email to set your password.', 'userspn')),
			'file_uploaded' => esc_html(__('The file has been uploaded successfully.', 'userspn')),
			'file_removed' => esc_html(__('The file has been removed.', 'userspn')),
			'confirm_remove_avatar' => esc_html(__('Are you sure you want to remove your avatar?', 'userspn')),
			'no_file_selected' => esc_html(__('Please select a file to upload.', 'userspn')),
			'field_removed' => esc_html(__('The field has been removed.', 'userspn')),
			'field_saved' => esc_html(__('The field has been saved successfully.', 'userspn')),
			'field_provide' => esc_html(__('Please provide at least field name and type.', 'userspn')),
			'activation_email' => esc_html(__('We have sent you an activation email. Please check your inbox or spam folder.', 'userspn')),
			'email_too_many' => esc_html(__('Your email has received too many emails. Please contact us.', 'userspn')),
			'newsletter_subscribed' => esc_html(__('Congratulations! You have been successfully subscribed to our newsletter.', 'userspn')),
			'email_sent' => esc_html(__('We have sent you an email. Please check your inbox or spam folder.', 'userspn')),
			'security_error' => esc_html(__('Security validation failed. Please try again.', 'userspn')),
			'save_before_preview' => esc_html(__('Please save your settings before previewing. The preview will show the last saved configuration. Continue?', 'userspn')),
			'confirm_bubble_position' => esc_html(__('Position saved successfully', 'userspn')),
			'confirm_position' => esc_html(__('Confirm position', 'userspn')),
			'cancel' => esc_html(__('Cancel', 'userspn')),
			'drag_bubble_instruction' => esc_html(__('Drag the bubble to the desired position', 'userspn')),
		]);

		// Security settings for JavaScript
		$recaptcha_site_key = get_option('userspn_recaptcha_site_key', '');
		$recaptcha_enabled = (get_option('userspn_recaptcha_enabled') === 'on') && !empty($recaptcha_site_key);
		wp_localize_script($this->plugin_name, 'userspn_security', [
			'recaptcha_enabled' => $recaptcha_enabled,
			'recaptcha_site_key' => $recaptcha_enabled ? $recaptcha_site_key : '',
			'honeypot_enabled' => (get_option('userspn_honeypot_enabled') === 'on'),
		]);
			
		$userspn_login = !empty($_GET['userspn_login']) ? USERSPN_Forms::userspn_sanitizer(wp_unslash($_GET['userspn_login'])) : '';
		$userspn_notice = !empty($_GET['userspn_notice']) ? USERSPN_Forms::userspn_sanitizer(wp_unslash($_GET['userspn_notice'])) : '';

		wp_localize_script($this->plugin_name, 'userspn_get', [
			'userspn_login' => $userspn_login,
			'userspn_notice' => $userspn_notice,
		]);

		// Initialize popups
		USERSPN_Popups::instance();

		// Initialize selectors
		USERSPN_Selector::instance();
	}

  	public function userspn_body_classes($classes) {
		$classes[] = 'userspn-body';

		if (!is_user_logged_in()) {
			$classes[] = 'userspn-body-unlogged';
		}else{
		$classes[] = 'userspn-body-logged-in';
		
		$user = new WP_User(get_current_user_id());
		foreach ($user->roles as $role) {
			$classes[] = 'userspn-body-' . $role;
		}
		}

	  return $classes;
  }
}
