<?php
/**
 * WPeMatico plugin for WordPress
 * plugin_functions
 * Contains all the hooks to be called for the plugins wordpress page and the activate/deactivate/uninstall methods.

 * @package   wpematico
 * @link      https://github.com/etruel/wpematico
 * @author    Esteban Truelsegaard <etruel@etruel.com>
 * @copyright 2006-2019 Esteban Truelsegaard
 * @license   GPL v2 or later
 */
// don't load directly 
if (!defined('ABSPATH')) {
	header('Status: 403 Forbidden');
	header('HTTP/1.1 403 Forbidden');
	exit();
}

add_filter('plugin_row_meta', 'wpematico_row_meta', 10, 2);
add_filter('plugin_action_links_' . WPEMATICO_BASENAME, 'wpematico_action_links');
add_action("after_plugin_row_" . WPEMATICO_BASENAME, 'wpematico_update_row', 10, 2);
add_action('admin_head', 'WPeMatico_plugins_admin_head');
add_action('admin_footer', 'wff_admin_footer');
add_action('admin_print_styles-plugins.php', 'wff_admin_styles');
add_action('wp_ajax_handle_feedback_submission', 'wff_handle_feedback_submission');

function wff_admin_styles() {
	global $pagenow, $page_hook;
	if ($pagenow == 'plugins.php' && !isset($_GET['page'])) {
		wp_register_style('WPematStylesheetPlugins', WPEMATICO_PLUGIN_URL . 'app/css/wpemat_plugin_styles.css');
		wp_enqueue_style('WPematStylesheetPlugins');
	}
}

function wff_admin_footer() {
	global $pagenow, $page_hook;

	if ($pagenow == 'plugins.php' && !isset($_GET['page'])) {
		$nonce = wp_create_nonce('wpematico_feedback_nonce');
		?>
		<div id="wpe_feedback" class="wpe_modal_log-box fade" style="display:none;">
			<div class="wpe_modal_log-body">
				<a id="skip_feedback" style="color:lightgray" href="#"><?php esc_html_e('Skip & deactivate', 'wpematico') ?></a>
				<a href="JavaScript:void(0);" class="wpe_modal_log-close" onclick="jQuery('#wpe_feedback').fadeToggle().removeClass('active'); jQuery('body').removeClass('wpe_modal_log-is-active');">
					<span class="dashicons dashicons-no-alt"></span>
				</a>
				<div class="wpe_modal_log-header">
					<h3><?php esc_html_e('Quick Feedback', 'wpematico') ?></h3>
				</div>
				<div class="wpe_modal_log-content">
					<h3><?php esc_html_e("We’d love to know why you're deactivating. Your feedback helps us improve!", 'wpematico') ?></h3>
					<form id="feedback_form">
						<label>
							<input type="radio" name="deactivation_reason" value="short_period" required>
							<?php esc_html_e('✅ I only needed the plugin temporarily', 'wpematico') ?>
						</label><br>
						<label>
							<input type="radio" name="deactivation_reason" value="temporary_deactivation">
							<?php esc_html_e('🔧 I’m troubleshooting an issue and will likely reactivate it', 'wpematico') ?>
						</label><br>
						<label>
							<input type="radio" name="deactivation_reason" value="stopped_working">
							<?php esc_html_e("⚡ The plugin isn’t working as expected (we can help fix it!)", 'wpematico') ?>
						</label><br>
						<label>
							<input type="radio" name="deactivation_reason" value="broke_site" id="broke_site_radio">
							<?php esc_html_e('❌ The plugin caused issues on my site (let us know so we can resolve them)', 'wpematico') ?>
						</label><br>
						<label>
							<input type="radio" name="deactivation_reason" value="another_plugin">
							<?php esc_html_e('🔄 I’m switching to another plugin (tell us what’s missing, and we may add it!)', 'wpematico') ?>
						</label><br>
						<label>
							<input type="radio" name="deactivation_reason" value="no_longer_needed">
							<?php esc_html_e('🤷 I no longer need it', 'wpematico') ?>
						</label><br>
						<label>
							<input type="radio" name="deactivation_reason" value="other">
							<?php esc_html_e('📝 Other', 'wpematico') ?>
						</label>
						<div id="other_reason_div" style="margin-left:40px; display: none;">
							<label for="other_reason">
								<b><?php esc_html_e('Tell us more about your experience: (Optional)', 'wpematico') ?></b>
							</label><br>
							<textarea name="explicit_reason" id="other_reason" style="width: 100%;"></textarea>
						</div>
						<div class="form_footer">
							<div style="float: left; margin-left: 20px;"><?php
								printf(esc_html__('💡 Remember, we offer FREE support on %s.', 'wpematico'),
										'<a href="https://etruel.com/my-account/support/" target="_blank" rel="noopener noreferrer" class="support-link">' . esc_html__('Our Site', 'wpematico') . '</a>');
								esc_html_e(' – we’re happy to help!', 'wpematico');
								?>
							</div>
							<button id="send_feedback" type="submit" class="button"><?php esc_html_e('Send & deactivate', 'wpematico') ?></button>
						</div>
					</form>
				</div>
			</div>
		</div>
		<script type="text/javascript">
			jQuery('#deactivate-wpematico').on('click', function (e) {
				e.preventDefault();
				jQuery('#wpe_feedback').fadeToggle().addClass('active');
				jQuery('body').addClass('wpe_modal_log-is-active');
			});

			jQuery('[name=deactivation_reason]').on("change", function () {
				var $otherReasonDiv = jQuery('#other_reason_div');
				$otherReasonDiv.hide();

				let selected = jQuery('input[name="deactivation_reason"]:checked').val();
				let tellmore = ['stopped_working', 'broke_site', 'another_plugin', 'no_longer_needed', 'other'];

				if (tellmore.includes(selected)) {
					// Move the div immediately after the selected radio label
					$otherReasonDiv.insertAfter(jQuery(this).closest('label'));
					$otherReasonDiv.fadeIn();
				}
			});

			jQuery('#feedback_form').on('submit', function (e) {
				e.preventDefault(); // Prevent form from submitting the default way
				var reason = jQuery('input[name="deactivation_reason"]:checked').val(); // Get the selected reason
				var explicit_reason = jQuery('#other_reason').val();

				// Send AJAX request to the server
				jQuery.ajax({
					url: ajaxurl,
					type: 'POST',
					data: {
						action: 'handle_feedback_submission',
						reason: reason,
						explicit_reason: explicit_reason,
						security: '<?php echo $nonce; ?>' // Nonce added here
					},
					success: function (response) {
						if (response.success) {
							// Close the feedback modal
							jQuery('#wpe_feedback').fadeToggle().removeClass('active');
							jQuery('body').removeClass('wpe_modal_log-is-active');
							// Reload the page and display the success message
							alert(response.data.message); // Display the success message
							location.reload(); // Reload the page
						} else {
							alert('Error: ' + response.data);
						}
					},
					error: function () {
						alert('An unexpected error occurred.');
					}
				});
			});

			jQuery('#skip_feedback').on('click', function () {
				// Send AJAX request to the server
				jQuery.ajax({
					url: ajaxurl,
					type: 'POST',
					data: {
						action: 'handle_feedback_submission',
						reason: 'skipped',
						security: '<?php echo $nonce; ?>' // Nonce added here
					},
					success: function (response) {
						if (response.success) {
							// Close the feedback modal
							jQuery('#wpe_feedback').fadeToggle().removeClass('active');
							jQuery('body').removeClass('wpe_modal_log-is-active');

							// Reload the page and display the success message
							alert(response.data.message); // Display the success message
							location.reload(); // Reload the page
						} else {
							alert('Error: ' + response.data);
						}
					},
					error: function () {
						alert('An unexpected error occurred.');
					}
				});
			});
		</script>
		<?php
	}
}

// Feedback handling function with all safety checks
function wff_handle_feedback_submission() {
    // 1. Verify nonce
    if (!isset($_POST['security']) || !wp_verify_nonce($_POST['security'], 'wpematico_feedback_nonce')) {
        wp_send_json_error('Invalid nonce.');
    }

    // 2. Verify user permissions
    if (!current_user_can('activate_plugins')) {
        wp_send_json_error('Unauthorized user.');
    }

    // 3. Validate and sanitize the form
    $allowed_reasons = ['short_period', 'temporary_deactivation', 'stopped_working', 'broke_site', 'another_plugin', 'no_longer_needed', 'other', 'skipped'];
    $reason = isset($_POST['reason']) && in_array($_POST['reason'], $allowed_reasons) ? sanitize_text_field($_POST['reason']) : '';
    
    $explicit_reason = isset($_POST['explicit_reason']) ? sanitize_textarea_field($_POST['explicit_reason']) : '';

    if (empty($reason)) {
        wp_send_json_error('Invalid reason.');
    }

    // 4. save the attempt in the log (optional but recommended)
    if (defined('WP_DEBUG') && WP_DEBUG) {
        error_log('WPematico feedback submission attempt by user ID: ' . get_current_user_id());
    }

    // 5. Send email (only if not skipped)
    if ($reason !== 'skipped') {
        $to = 'hello@etruel.com';
        $subject = 'Plugin Deactivation Feedback';
        $message = "A user deactivated the plugin for the following reason: " . $reason;
        
        if(!empty($explicit_reason)) {
            $message .= "\n\nThe user wrote: " . $explicit_reason;
        }
        
        $headers = ['From: ' . get_bloginfo('name') . ' <wordpress@' . parse_url(home_url(), PHP_URL_HOST) . '>'];
        
        if (!wp_mail($to, $subject, $message, $headers)) {
            wp_send_json_error('Failed to send email.');
        }
    }

    // 6. Deactivate the plugin
    $plugin_path = 'wpematico/wpematico.php';
    
    // Verify that the plugin is active before attempting to deactivate it.
    if (is_plugin_active($plugin_path)) {
        deactivate_plugins($plugin_path);
        
        // Verify that the plugin was deactivated correctly
        if (!is_plugin_active($plugin_path)) {
            wp_send_json_success(['message' => esc_html__('Deactivated successfully','wpematico')]);
        } else {
            wp_send_json_error('Failed to deactivate plugin.');
        }
    } else {
        wp_send_json_error('Plugin is not active.');
    }
}

function WPeMatico_plugins_admin_head(): void {
	global $pagenow, $page_hook;
	if ($pagenow == 'plugins.php') {
		?>
		<script type="text/javascript">
			jQuery(document).ready(function ($) {
				$('tr[data-slug=wpematico]').addClass('update');
			});
		</script>
		<style type="text/css">
			@media screen and (max-width: 782px) {
				#wpematico_addons_row{
					display: none;
				}
			}
			.wpematico_active_addon {
				padding: 1px 5px;
				background: orange;
				border-radius: 5px;
				margin: 0 3px;
			}
			.wpematico_addon {
				padding: 1px 5px;
				background: #8f7444;
				border-radius: 5px;
				margin: 0 3px;
			}
		</style>
		<?php
	}
}

/**
 * Actions-Links del Plugin
 *
 * @param   array   $data  Original Links
 * @return  array   $data  modified Links
 */
function wpematico_update_row($file, $plugin_data) {
	$plugins   = get_plugins();
	$addons	   = read_wpem_addons($plugins);
	$installed = "";
	foreach ($addons as $key => $plugin) {
		if (!isset($plugin['installed'])) {
			unset($addons[$key]);
		} elseif ($plugin['installed']) {
			if (is_plugin_active($key)) {
				$installed .= '<span class="wpematico_active_addon">' . str_replace("WPeMatico", "", $plugin['Name']) . '</span> ';
			} else {
				$installed .= '<span class="wpematico_addon">' . str_replace("WPeMatico", "", $plugin['Name']) . '</span> ';
			}
		}
	}
	if (empty($installed))
		$installed	  = '<span class="wpematico_addon">' . __('None.', 'wpematico') . '</span> ';
	echo '<tr id="wpematico_addons_row" class="plugin-update-tr active" data-slug="wpematico-active-extensions">';
	echo '<td class="plugin-update colspanchange" colspan="5">';
	echo '<div class="notice inline notice-success notice-alt">';
	$allowed_tags = array('span' => array('class' => array(), 'id' => array()), 'p' => array());
	echo '<a href="' . esc_attr(admin_url('plugins.php?page=wpemaddons')) . '" target="_self" title="' . esc_attr__('Open Extensions plugins page:', 'wpematico') . '">' . esc_html__('Installed Extensions:', 'wpematico') . '</a>' . wp_kses($installed, $allowed_tags);
	echo '</div>';
	echo '</td>';
	echo '</tr>';
}

/**
 * Actions-Links del Plugin
 *
 * @param   array   $data  Original Links
 * @return  array   $data  modified Links
 */
function wpematico_action_links($data) {
	if (!current_user_can('manage_options')) {
		return $data;
	}
	return array_merge($data, array(
		'<a href="edit.php?post_type=wpematico&page=wpematico_settings" title="' . __('Load WPeMatico Settings Page', 'wpematico') . '">' . __('Settings', 'wpematico') . '</a>',
		'<a href="https://etruel.com/downloads/wpematico-perfect-package/" target="_Blank" title="' . __('Take a look at the all bundled Addons', 'wpematico') . '">' . __('Go Perfect', 'wpematico') . '</a>',
		'<a href="https://github.com/etruel/wpematico" target="_blank"><b>GitHub</b></a>',
//		'<a href="https://etruel.com/checkout?edd_action=add_to_cart&download_id=4313&edd_options[price_id]=2" target="_Blank" title="' . __('Buy all bundled Addons', 'wpematico' ) . '">' . __('Go Perfect', 'wpematico' ) . '</a>',
	));
}

/**
 * Meta-Links del Plugin
 *
 * @param   array   $data  Original Links
 * @param   string  $page  plugin actual
 * @return  array   $data  modified Links
 */
function wpematico_row_meta($data, $page) {
	if ($page != WPEMATICO_BASENAME) {
		return $data;
	}

	return array_merge($data, array(
		//'<a href="http://www.wpematico.com/wpematico/" target="_blank">' . __('Info & comments') . '</a>',
		'<a href="' . admin_url('plugins.php?page=wpemaddons') . '" target="_self">' . __('Extensions', 'wpematico') . '</a>',
		'<a href="https://etruel.com/my-account/support/" target="_blank">' . __('Support', 'wpematico') . '</a>',
		'<a href="https://wordpress.org/support/view/plugin-reviews/wpematico?filter=5&rate=5#new-post" target="_Blank" title="Rate 5 stars on Wordpress.org">' . __('Rate Plugin', 'wpematico') . '</a>',
		'<strong><a href="https://etruel.com/downloads/wpematico-essentials/" target="_Blank" title="' . __('Take a look at the Essentials features', 'wpematico') . '">' . __('Go PRO', 'wpematico') . '</a></strong>',
//		'<p>' . __('Activated Extensions:', 'wpematico' ) . '</p>',
	));
}

/* * *************************************************************************************
  /***************************************************************************************
 * Activation, Upgrading and uninstall functions
 * ************************************************************************************ */
register_activation_hook(WPEMATICO_BASENAME, 'wpematico_activate');
register_deactivation_hook(WPEMATICO_BASENAME, 'wpematico_deactivate');
register_uninstall_hook(WPEMATICO_BASENAME, 'wpematico_uninstall');

add_action('plugins_loaded', 'wpematico_update_db_check');

function wpematico_update_db_check() {
	if (version_compare(WPEMATICO_VERSION, get_option('wpematico_db_version'), '>')) { // check if updated (WILL SAVE new version on welcome )
		if (!get_transient('_wpematico_activation_redirect')) { //just one time running
			wpematico_install(get_option('wpematico_db_version'));
		}
		delete_option('wpematico_lastlog_disabled');
	}
}

/**
 * Runs on plugin activation and on each version update.
 * Each versioned migration block checks $old_db_version to decide whether to run.
 * This correctly handles version-skipping: upgrading from 2.8.18 to 2.8.22 will
 * apply all intermediate migrations in order.
 *
 * On fresh activation, called with no argument ($old_db_version = ''), so no
 * migration blocks run — only the version option is written.
 *
 * To add a future migration: copy the 2.8.20 block, change the version gate and
 * implement the campaign loop body. Keep the raw get_post_meta / update_post_meta
 * pattern — never use get_campaign() + update_campaign() here, as check_campaigndata
 * strips addon fields and causes permanent data loss.
 *
 * @param string $old_db_version  The wpematico_db_version value before this update.
 */
function wpematico_install($old_db_version = '') {

	// --- Migration: 2.8.20 — fix stored timestamps from local-time to real UTC ----------
	// Old code stored current_time('timestamp') = time() + gmt_offset in lastrun.
	// New code stores time() (real UTC). Subtract the offset on upgrade so schedules stay correct.
	// Also recalculates cronnextrun via the now UTC-based time_cron_next().
	if ($old_db_version && version_compare($old_db_version, '2.8.20', '<')) {
		$offset    = (int) round(get_option('gmt_offset') * 3600);
		$args      = array(
			'orderby'	  => 'ID',
			'order'		  => 'ASC',
			'post_type'	  => 'wpematico',
			'numberposts' => -1,
		);
		$campaigns = get_posts($args);
		foreach ($campaigns as $post) {
			// Read raw campaign_data WITHOUT passing through check_campaigndata.
			// check_campaigndata rebuilds the array from scratch and strips all addon fields
			// (GPT-Spinner, FullContent, etc.), causing permanent data loss when saved back.
			$raw = get_post_meta($post->ID, 'campaign_data', true);
			if (!is_array($raw)) {
				$raw = array();
			}

			if ($offset !== 0 && isset($raw['lastrun']) && (int) $raw['lastrun'] > 0) {
				$raw['lastrun'] = (int) $raw['lastrun'] - $offset;
				update_post_meta($post->ID, 'lastrun', $raw['lastrun']);
			}

			$cron               = isset($raw['cron']) ? $raw['cron'] : '0 3 * * *';
			$raw['cronnextrun'] = (int) WPeMatico::time_cron_next($cron);
			update_post_meta($post->ID, 'cronnextrun', $raw['cronnextrun']);

			// Save campaign_data with all fields intact, preserving addon settings.
			update_post_meta($post->ID, 'campaign_data', $raw);
		}
	}
	// --- End migration 2.8.20 -----------------------------------------------------------

	// Add future per-version migrations here following the same pattern:
	// if ($old_db_version && version_compare($old_db_version, '2.8.XX', '<')) { ... }

	$version = rtrim(WPEMATICO_VERSION, '.0');
	$v		 = explode('.', $version);
	// Redirect to welcome page only on major version updates (e.g. 2.9)
	if (count($v) <= 2) {
		set_transient('_wpematico_activation_redirect', true, 120); // After two minutes lost welcome screen
	} else {
		update_option('wpematico_db_version', WPEMATICO_VERSION, false);
	}
}

/**
 * This function will be hooked after @check_campaigndata and only on install or update of wpematico .
 * @param $campaigndata an array with all campaign data.
 * @return $campaigndata an array with filtered campaign data to compatibility.
 * @since 1.9.0
 */
function wpematico_campaign_compatibilty_after($campaigndata) {
	$wpematico_version = get_option('wpematico_db_version');
	/**
	 * Compatibility with enable convert to UTF-8
	 * @since 1.9.0
	 */
	if (version_compare($wpematico_version, '1.9', '<')) {
		$campaigndata['campaign_enable_convert_utf8'] = true;
	}

	/**
	 * Compatibility with previous image processing.
	 * @since 1.7.0
	 */
	if (version_compare($wpematico_version, '1.6.4', '<=')) {
		if ($campaigndata['campaign_imgcache']) {
			$campaigndata['campaign_no_setting_img'] = true;
		}
	}
	$campaign_cancel_imgcache = (!isset($post_data['campaign_cancel_imgcache']) || empty($post_data['campaign_cancel_imgcache'])) ? false : (($post_data['campaign_cancel_imgcache'] == 1) ? true : false);
	if ($campaign_cancel_imgcache) {
		$campaigndata['campaign_no_setting_img'] = true;
		$campaigndata['campaign_imgcache']		 = false;
		$campaigndata['campaign_attach_img']	 = false;
		$campaigndata['campaign_featuredimg']	 = false;
		$campaigndata['campaign_rmfeaturedimg']	 = false;
		$campaigndata['campaign_customupload']	 = false;
		if ($campaigndata['campaign_nolinkimg']) {
			$campaigndata['campaign_imgcache'] = true;
		}
	}

	return $campaigndata;
}

/**
 * activation
 * @return void
 */
function wpematico_activate() {
	WPeMatico::Create_campaigns_page();
	// ATTENTION: This is *only* done during plugin activation hook // You should *NEVER EVER* do this on every page load!!
	flush_rewrite_rules();

	// Call installation and update routines
	wpematico_install();

	wp_clear_scheduled_hook('wpematico_cron');
	//make schedule
	wp_schedule_event(0, 'wpematico_int', 'wpematico_cron');
}

/**
 * deactivation
 * @return void
 */
function wpematico_deactivate() {
	//remove cron job
	wp_clear_scheduled_hook('wpematico_cron');
	// Don't delete options or campaigns
}

/**
 * Uninstallation
 * @global $wpdb, $blog_id
 * @return void
 */
function wpematico_uninstall() {
	global $wpdb, $blog_id;
	$danger						 = get_option('WPeMatico_danger', array());
	$danger['wpemdeleoptions']	 = (isset($danger['wpemdeleoptions']) && !empty($danger['wpemdeleoptions'])) ? $danger['wpemdeleoptions'] : false;
	$danger['wpemdelecampaigns'] = (isset($danger['wpemdelecampaigns']) && !empty($danger['wpemdelecampaigns'])) ? $danger['wpemdelecampaigns'] : false;
	if (is_network_admin() && $danger['wpemdeleoptions']) {
		if (isset($wpdb->blogs)) {
			$blogs = $wpdb->get_results(
					$wpdb->prepare(
							'SELECT blog_id ' .
							'FROM ' . $wpdb->blogs . ' ' .
							"WHERE blog_id <> '%s'",
							$blog_id
					)
			);
			foreach ($blogs as $blog) {
				delete_blog_option($blog->blog_id, WPeMatico::OPTION_KEY);
			}
		}
	}
	if ($danger['wpemdeleoptions']) {
		delete_option(WPeMatico::OPTION_KEY);
		delete_option('wpematico_db_version');
	}
	//delete campaigns
	if ($danger['wpemdelecampaigns']) {
		$args	   = array('post_type' => 'wpematico', 'orderby' => 'ID', 'order' => 'ASC');
		$campaigns = get_posts($args);
		foreach ($campaigns as $post) {
			wp_delete_post($post->ID, true);  // forces delete to avoid trash
		}
	}
}

add_action('wp_ajax_fetch_taxonomies', 'fetch_taxonomies');

function fetch_taxonomies() {
	if (!isset($_POST['post_type'], $_POST['post_id'])) {
		wp_die('No post type or post ID provided.');
	}

	$post_type	= sanitize_text_field($_POST['post_type']);
	$post_id	= intval($_POST['post_id']); // Ensure post ID is an integer
	$taxonomies = get_object_taxonomies($post_type, 'objects');

	if (!empty($taxonomies)) {
		foreach ($taxonomies as $taxonomy) {
			if ($taxonomy->hierarchical) { // Only show hierarchical taxonomies
				echo '<span class="title inline-edit-categories-label">' . esc_html($taxonomy->labels->name) . '</span>';
				echo '<input type="hidden" name="tax_input[' . esc_attr($taxonomy->name) . '][]" value="0" />'; // Default value 0
				echo '<ul class="cat-checklist ' . esc_attr($taxonomy->name) . '-checklist">';
				get_campaign_tax($taxonomy->name);
				echo '</ul>';
			}
		}
	}

	wp_die(); // Properly terminate the AJAX request
}

add_action('wp_ajax_fetch_tags', 'fetch_tags');

function fetch_tags() {
	if (!isset($_POST['post_type'])) {
		wp_die('No post type provided.');
	}

	$post_type = sanitize_text_field($_POST['post_type']);

	// Get the taxonomies for the selected post type
	$taxonomy_names	 = get_object_taxonomies($post_type);
	$flat_taxonomies = array();

	foreach ($taxonomy_names as $taxonomy_name) {
		$taxonomy = get_taxonomy($taxonomy_name);
		if (!$taxonomy->show_ui)
			continue;

		if (!$taxonomy->hierarchical)
			$flat_taxonomies[] = $taxonomy;
	}

	// Output taxonomies
	$html = '';

	if (count($flat_taxonomies)) {

		foreach ($flat_taxonomies as $taxonomy) {
			if (current_user_can($taxonomy->cap->assign_terms)) {
				$current_tags = get_campaign_tags($taxonomy->name);
				if ($taxonomy->name != 'post_tag') {
					// Create a label for each taxonomy with a textarea for the tags
					$html .= '<label class="inline-edit-tags">';
					$html .= '<span class="title">' . esc_html($taxonomy->labels->name) . '</span>';
					$html .= '<textarea cols="22" rows="1" name="tax_input[' . esc_attr($taxonomy->name) . ']" class="tax_input_' . esc_attr($taxonomy->name) . '">' . esc_textarea($current_tags) . '</textarea>';
					$html .= '</label>';
				} else {
					// Create a label for each taxonomy with a textarea for the tags
					$html .= '<label class="inline-edit-tags">';
					$html .= '<span class="title">' . esc_html($taxonomy->labels->name) . '</span>';
					$html .= '<textarea cols="22" rows="1" name="campaign_tags" class="tax_input_' . esc_attr($taxonomy->name) . '">' . esc_textarea($current_tags) . '</textarea>';
					$html .= '</label>';
				}
			}
		}
	}
	// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
	echo $html;
	wp_die(); // Properly terminate the AJAX request
}

/**
 * Summary of get_campaign_tags
 * @param mixed $taxonomy_name
 * @return string
 */
function get_campaign_tags($taxonomy_name) {
	if (!isset($_POST['post_id'])) {
		wp_send_json_error();
	}
	if ($taxonomy_name != 'post_tag') {
		$current_tags = get_the_terms($_POST['post_id'], $taxonomy_name);
		$all_tags	  = array();

		if ($current_tags && !is_wp_error($current_tags)) {
			foreach ($current_tags as $tag) {
				$all_tags[] = $tag->name;
			}

			$current_tags = implode(',', $all_tags);
		}
	} else {
		$campaign_data = get_post_meta($_POST['post_id'], 'campaign_data');
		$campaign_data = (isset($campaign_data[0])) ? $campaign_data[0] : array(0);
		$tags		   = apply_filters('wpematico_check_campaigndata', $campaign_data);
		$current_tags  = $tags['campaign_tags'];
	}
	return $current_tags;
}

function get_campaign_tax($taxonomy_name) {
	if (!isset($_POST['post_id'])) {
		wp_send_json_error();
	}
	if ($taxonomy_name == 'category') {
		$campaign_data = get_post_meta($_POST['post_id'], 'campaign_data');
		$campaign_data = (isset($campaign_data[0])) ? $campaign_data[0] : array(0);
		$tags		   = apply_filters('wpematico_check_campaigndata', $campaign_data);
		$current_tax   = $tags['campaign_categories'];

		// Check the terms for the post
		wp_terms_checklist($_POST['post_id'], $args = array(
			'taxonomy'			   => $taxonomy_name,
			'descendants_and_self' => 0,
			'selected_cats'		   => array_map('intval', $current_tax),
			'popular_cats'		   => false,
			'walker'			   => null,
			'checked_ontop'		   => true
		));
	} else {
		wp_terms_checklist($_POST['post_id'], array('taxonomy' => $taxonomy_name));
	}
}

// wpematico_log() and wpematico_get_log_file_path() are defined in wpematico_functions.php
// so they are available both in admin and during WP-Cron (outside is_admin()).
